00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 char separation_C[] = "$Header: /cvsroot/Lorene/C++/Source/Bhole_binaire/separation.C,v 1.2 2003/10/03 15:58:44 j_novak Exp $" ;
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #include <stdlib.h>
00062
00063
00064 #include "cmp.h"
00065 #include "proto.h"
00066
00067 void separation (const Cmp& c1, const Cmp& c2, Cmp& res1, Cmp& res2, int decrois,
00068 int puiss, int lmax, double precision, const double relax, const int itemax, const int flag) {
00069
00070 assert (c1.get_etat() != ETATNONDEF) ;
00071 assert (c2.get_etat() != ETATNONDEF) ;
00072
00073 if ((c1.get_etat() == ETATZERO) && (c2.get_etat() == ETATZERO)) {
00074 res1.set_etat_zero() ;
00075 res2.set_etat_zero() ;
00076 return ;
00077 }
00078 else {
00079
00080 res1 = c1 ;
00081 if (res1.get_etat() == ETATZERO) {
00082 res1.annule_hard() ;
00083 res1.std_base_scal() ;
00084 }
00085
00086 res1.raccord_externe (decrois, puiss, lmax) ;
00087 for (int i=0 ; i<decrois ; i++)
00088 res1.dec_dzpuis() ;
00089
00090 res2 = c2 ;
00091 if (res2.get_etat() == ETATZERO) {
00092 res2.annule_hard() ;
00093 res2.std_base_scal() ;
00094 }
00095 res2.raccord_externe (decrois, puiss, lmax) ;
00096 for (int i=0 ; i<decrois ; i++)
00097 res2.dec_dzpuis() ;
00098
00099 int indic = 1 ;
00100 int conte = 0 ;
00101
00102 while (indic == 1) {
00103 Cmp old_un (res1) ;
00104 Cmp old_deux (res2) ;
00105
00106
00107 Mtbl xa_mtbl_un (c1.get_mp()->xa) ;
00108 Mtbl ya_mtbl_un (c1.get_mp()->ya) ;
00109 Mtbl za_mtbl_un (c1.get_mp()->za) ;
00110
00111 Mtbl xa_mtbl_deux (c2.get_mp()->xa) ;
00112 Mtbl ya_mtbl_deux (c2.get_mp()->ya) ;
00113 Mtbl za_mtbl_deux (c2.get_mp()->za) ;
00114
00115 double xabs, yabs, zabs, air, theta, phi ;
00116 int np, nt, nr ;
00117
00118
00119 int nz_un = c1.get_mp()->get_mg()->get_nzone() ;
00120 for (int l=1 ; l<nz_un-1 ; l++) {
00121
00122 np = c1.get_mp()->get_mg()->get_np(l) ;
00123 nt = c1.get_mp()->get_mg()->get_nt(l) ;
00124 nr = c1.get_mp()->get_mg()->get_nr(l) ;
00125
00126 for (int k=0 ; k<np ; k++)
00127 for (int j=0 ; j<nt ; j++)
00128 for (int i=0 ; i<nr ; i++) {
00129 xabs = xa_mtbl_un (l, k, j, i) ;
00130 yabs = ya_mtbl_un (l, k, j, i) ;
00131 zabs = za_mtbl_un (l, k, j, i) ;
00132
00133 c2.get_mp()->convert_absolute(xabs, yabs, zabs, air, theta, phi) ;
00134 res1.set(l, k, j, i) =
00135 (1-relax)*res1.set(l, k, j, i) +
00136 relax*(c1(l, k, j, i) - old_deux.val_point(air, theta, phi)) ;
00137 }
00138 }
00139
00140
00141 int nz_deux = c2.get_mp()->get_mg()->get_nzone() ;
00142 for (int l=1 ; l<nz_deux-1 ; l++) {
00143
00144 np = c2.get_mp()->get_mg()->get_np(l) ;
00145 nt = c2.get_mp()->get_mg()->get_nt(l) ;
00146 nr = c2.get_mp()->get_mg()->get_nr(l) ;
00147
00148 for (int k=0 ; k<np ; k++)
00149 for (int j=0 ; j<nt ; j++)
00150 for (int i=0 ; i<nr ; i++) {
00151
00152 xabs = xa_mtbl_deux (l, k, j, i) ;
00153 yabs = ya_mtbl_deux (l, k, j, i) ;
00154 zabs = za_mtbl_deux (l, k, j, i) ;
00155
00156 c1.get_mp()->convert_absolute(xabs, yabs, zabs, air, theta, phi) ;
00157 res2.set(l, k, j, i) =
00158 (1-relax)*res2.set(l, k, j, i) +
00159 relax*(c2(l, k, j, i) - old_un.val_point(air, theta, phi)) ;
00160 }
00161 }
00162
00163
00164 res1.va.set_etat_c_qcq() ;
00165 res2.va.set_etat_c_qcq() ;
00166
00167 res1.raccord_externe (decrois, puiss, lmax) ;
00168 for (int i=0 ; i<decrois ; i++)
00169 res1.dec_dzpuis() ;
00170
00171 res1.va.coef_i() ;
00172 res2.raccord_externe (decrois, puiss, lmax) ;
00173 for (int i=0 ; i<decrois ; i++)
00174 res2.dec_dzpuis() ;
00175 res2.va.coef_i() ;
00176
00177
00178
00179 double erreur = 0 ;
00180
00181 Tbl diff_un (diffrelmax(res1, old_un)) ;
00182 for (int i=1 ; i<nz_un-1 ; i++)
00183 if (diff_un(i)>erreur)
00184 erreur = diff_un(i) ;
00185
00186 Tbl diff_deux (diffrelmax(res2, old_deux)) ;
00187 for (int i=1 ; i<nz_deux-1 ; i++)
00188 if (diff_deux(i)>erreur)
00189 erreur = diff_deux(i) ;
00190
00191 if (flag == 1)
00192 cout << "Pas " << conte << " : erreur = " << erreur << endl ;
00193 if (erreur<=precision)
00194 indic = -1 ;
00195
00196 conte ++ ;
00197 if (conte > itemax)
00198 indic = -1 ;
00199 }
00200 }
00201 }