00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 char map_et_poisson_falloff_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_poisson_falloff.C,v 1.1 2004/11/30 20:53:59 k_taniguchi Exp $" ;
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "map.h"
00044 #include "cmp.h"
00045 #include "param.h"
00046
00047
00048
00049 void Map_et::poisson_falloff(const Cmp& source, Param& par, Cmp& uu, int k_falloff) const {
00050
00051 assert(source.get_etat() != ETATNONDEF) ;
00052 assert(source.get_mp() == this) ;
00053
00054 assert(uu.get_mp() == this) ;
00055
00056 int nz = mg->get_nzone() ;
00057
00058
00059
00060
00061
00062 Mtbl unjj = 1 + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00063
00064 Mtbl apre1(*mg) ;
00065 apre1.set_etat_qcq() ;
00066 for (int l=0; l<nz; l++) {
00067 *(apre1.t[l]) = alpha[l]*alpha[l] ;
00068 }
00069
00070 apre1 = apre1 * dxdr * dxdr * unjj ;
00071
00072
00073 Cmp apre(*this) ;
00074 apre = apre1 ;
00075
00076 Tbl amax0 = max(apre1) ;
00077
00078
00079 Mtbl amax1(*mg) ;
00080 amax1.set_etat_qcq() ;
00081 for (int l=0; l<nz; l++) {
00082 *(amax1.t[l]) = amax0(l) ;
00083 }
00084
00085 Cmp amax(*this) ;
00086 amax = amax1 ;
00087
00088
00089
00090
00091
00092 int nitermax = par.get_int() ;
00093 int& niter = par.get_int_mod() ;
00094 double lambda = par.get_double() ;
00095 double unmlambda = 1. - lambda ;
00096 double precis = par.get_double(1) ;
00097
00098 Cmp& ssj = par.get_cmp_mod() ;
00099
00100 Cmp ssjm1 = ssj ;
00101 Cmp ssjm2 = ssjm1 ;
00102
00103 Valeur& vuu = uu.va ;
00104
00105 Valeur vuujm1(*mg) ;
00106 if (uu.get_etat() == ETATZERO) {
00107 vuujm1 = 1 ;
00108 vuujm1.set_base( vuu.base ) ;
00109 }
00110 else{
00111 vuujm1 = vuu ;
00112 }
00113
00114
00115
00116 Map_af mpaff(*this) ;
00117 Param par_nul ;
00118
00119 cout << "Map_et::poisson : relat. diff. u^J <-> u^{J-1} : " << endl ;
00120
00121
00122
00123
00124
00125
00126
00127 Tbl tdiff(nz) ;
00128 double diff ;
00129 niter = 0 ;
00130
00131 do {
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 Valeur duudx = (uu.va).dsdx() ;
00143
00144 const Valeur& d2uudtdx = duudx.dsdt() ;
00145
00146 const Valeur& std2uudpdx = duudx.stdsdp() ;
00147
00148
00149
00150
00151
00152 Valeur sxlapang = uu.va ;
00153
00154 sxlapang.ylm() ;
00155
00156 sxlapang = sxlapang.lapang() ;
00157
00158 sxlapang = sxlapang.sx() ;
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 Valeur varduudx = duudx ;
00173
00174 uu.set_etat_qcq() ;
00175
00176 Base_val sauve_base = varduudx.base ;
00177
00178 vuu = 2. * dxdr * ( rsxdxdr * unjj - 1.) * varduudx
00179 + ( rsxdxdr*rsxdxdr * unjj - 1.) * xsr * sxlapang ;
00180
00181 vuu.set_base(sauve_base) ;
00182
00183 vuu = vuu.sx() ;
00184
00185
00186
00187
00188
00189
00190
00191
00192 sauve_base = vuu.base ;
00193
00194 vuu = xsr * vuu
00195 + 2. * dxdr * ( sr2drdt * d2uudtdx
00196 + sr2stdrdp * std2uudpdx ) ;
00197
00198 vuu += dxdr * ( lapr_tp + dxdr * (
00199 dxdr* unjj * d2rdx2
00200 - 2. * ( sr2drdt * d2rdtdx + sr2stdrdp * sstd2rdpdx ) )
00201 ) * duudx ;
00202
00203 vuu.set_base(sauve_base) ;
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 ssj = lambda * ssjm1 + unmlambda * ssjm2 ;
00215
00216 ssj = ( source + uu + (amax - apre) * ssj ) / amax ;
00217
00218 (ssj.va).set_base((source.va).base) ;
00219
00220
00221
00222
00223
00224
00225
00226 mpaff.poisson_falloff(ssj, par_nul, uu, k_falloff) ;
00227
00228
00229
00230 tdiff = diffrel(vuu, vuujm1) ;
00231
00232 diff = max(tdiff) ;
00233
00234
00235 cout << " iter: " << niter << " : " ;
00236 for (int l=0; l<nz; l++) {
00237 cout << tdiff(l) << " " ;
00238 }
00239 cout << endl ;
00240
00241
00242
00243
00244
00245 ssjm2 = ssjm1 ;
00246 ssjm1 = ssj ;
00247 vuujm1 = vuu ;
00248
00249 niter++ ;
00250
00251 }
00252 while ( (diff > precis) && (niter < nitermax) ) ;
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 }