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
00030 char valeur_equipot_out_C[] = "$Header: /cvsroot/Lorene/C++/Source/Valeur/valeur_equipot_out.C,v 1.3 2003/12/19 15:05:57 j_novak Exp $" ;
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 #include <math.h>
00063
00064
00065 #include "valeur.h"
00066 #include "itbl.h"
00067 #include "param.h"
00068 #include "nbr_spx.h"
00069 #include "utilitaires.h"
00070
00071
00072 double valeur_equipot_fonc(double, const Param&) ;
00073
00074
00075
00076 void Valeur::equipot_outward(double uu0, int nz_search, double precis,
00077 int nitermax, int& niter, Itbl& l_iso,
00078 Tbl& xi_iso) const {
00079
00080
00081 int nz = mg->get_nzone() ;
00082 int nt = mg->get_nt(0) ;
00083 int np = mg->get_np(0) ;
00084
00085 double precis0 = precis ;
00086
00087
00088
00089 assert(etat == ETATQCQ) ;
00090 assert(nz_search > 0) ;
00091 assert(nz_search <= nz) ;
00092 for (int l=1; l<nz_search; l++) {
00093 assert( mg->get_nt(l) == nt ) ;
00094 assert( mg->get_np(l) == np ) ;
00095 }
00096
00097 coef() ;
00098
00099 l_iso.set_etat_qcq() ;
00100 xi_iso.set_etat_qcq() ;
00101
00102 Param parf ;
00103 int j, k, l2 ;
00104 parf.add_int_mod(j, 0) ;
00105 parf.add_int_mod(k, 1) ;
00106 parf.add_int_mod(l2, 2) ;
00107 parf.add_double(uu0) ;
00108 parf.add_mtbl_cf(*c_cf) ;
00109
00110
00111
00112
00113
00114 niter = 0 ;
00115
00116 for (k=0; k<np; k++) {
00117
00118 for (j=0; j<nt; j++) {
00119
00120
00121
00122
00123
00124 int i2 = 0 ;
00125 l2 = nz ;
00126 for (int l=0; l<nz_search; l++) {
00127 int nr = mg->get_nr(l) ;
00128
00129 for (int i=0; i<nr; i++) {
00130 double uux = (*this)(l, k, j, i) ;
00131 if ( ( (uux < uu0) || ( fabs(uux-uu0) < precis0 ) ) &&
00132 (uux != __infinity) ) {
00133 l2 = l ;
00134 i2 = i ;
00135 break ;
00136 }
00137 }
00138
00139 if (l2 == l) break ;
00140 }
00141
00142 if (l2==nz) {
00143 cout <<
00144 "Valeur::equipot_outward: the point uu < uu0 has not been found"
00145 << endl ;
00146 cout << " for the phi index " << k
00147 << " and the theta index " << j << endl ;
00148 cout << " uu0 = " << uu0 << endl ;
00149 abort () ;
00150 }
00151
00152
00153 int i3 = 0 ;
00154 if (i2 != 0) {
00155 i3 = i2 - 1 ;
00156 }
00157 else {
00158 if (l2 != 0) {
00159
00160 l2-- ;
00161 i2 = mg->get_nr(l2) - 1 ;
00162
00163 double uux = (*this)(l2, k, j, i2) ;
00164
00165 if ( ( fabs(uux-uu0) > precis0 ) ) {
00166
00167 cout <<
00168 "Valeur::equipot_outward: WARNING: potentially discontinuous field !"
00169 << endl ;
00170 cout << " k, j : " << k << " " << j << endl ;
00171 cout << " uux, uu0 : " << uux << " " << uu0 << endl ;
00172 }
00173
00174 l_iso.set(k, j) = l2 ;
00175 xi_iso.set(k, j) = (mg->get_grille3d(l2))->x[i2] ;
00176 continue ;
00177
00178 }
00179 else {
00180 cout <<
00181 "Valeur::equipot_outward: the field has some negative value at the center !"
00182 << endl ;
00183 cout << " k, j : " << k << " " << j << endl ;
00184 cout << " uu0 : " << uu0 << endl ;
00185 abort () ;
00186 }
00187 }
00188
00189 l_iso.set(k, j) = l2 ;
00190
00191 double x2 = (mg->get_grille3d(l2))->x[i2] ;
00192 double x3 = (mg->get_grille3d(l2))->x[i3] ;
00193
00194 double y2 = (*this)(l2, k, j, i2) - uu0 ;
00195
00196
00197
00198 int niter0 = 0 ;
00199 if (fabs(y2) < precis0) {
00200 xi_iso.set(k, j) = x2 ;
00201 }
00202 else {
00203 xi_iso.set(k, j) = zerosec(valeur_equipot_fonc, parf, x2, x3, precis,
00204 nitermax, niter0 ) ;
00205 }
00206
00207 niter = ( niter0 > niter ) ? niter0 : niter ;
00208
00209 }
00210 }
00211
00212 }
00213