00001 subroutine iteration_WL(iter_count)
00002 use phys_constant, only : long, nnrg, nntg, nnpg
00003 use def_formulation, only : chgra, chope
00004 use def_metric_hij, only : hxxd, hxyd, hxzd, hyyd, hyzd, hzzd
00005 use grid_parameter
00006 use coordinate_grav_r
00007 use coordinate_grav_phi
00008 use coordinate_grav_theta
00009 use weight_midpoint_grav
00010 use make_array_2d
00011 use make_array_3d
00012 use make_array_4d
00013 use def_metric
00014 use def_matter
00015 use interface_interpo_fl2gr
00016 use interface_poisson_solver
00017
00018
00019
00020 use interface_compute_shift
00021 use interface_compute_alps2alph
00022 use interface_hydrostatic_eq_WL_peos
00023 use interface_calc_surface
00024 use interface_update_grfield
00025 use interface_update_matter
00026 use interface_update_parameter_WL_peos
00027 use interface_update_surface
00028 use interface_error_matter
00029 use interface_source_HaC_WL
00030 use interface_source_MoC_WL
00031 use interface_source_trfreeG_WL
00032 use interface_source_trG_WL
00033 use interface_compute_fnc_multiple
00034 use interface_error_metric_type0
00035 use interface_error_metric_type2
00036 implicit none
00037 real(long), pointer :: sou(:,:,:), pot(:,:,:)
00038 real(long), pointer :: sou1(:,:,:), sou2(:,:,:), sou3(:,:,:)
00039 real(long), pointer :: sou4(:,:,:), sou5(:,:,:), sou6(:,:,:)
00040 real(long), pointer :: potf(:,:,:), emd_bak(:,:,:), pot_bak(:,:,:)
00041 real(long), pointer :: potrs(:,:)
00042 real(long), pointer :: potx(:,:,:), poty(:,:,:), potz(:,:,:)
00043 real(long), pointer :: potx_bak(:,:,:), poty_bak(:,:,:), potz_bak(:,:,:)
00044 real(long), pointer :: souvec(:,:,:,:), souten(:,:,:,:)
00045 real(long), pointer :: pot1(:,:,:), pot2(:,:,:), pot3(:,:,:)
00046 real(long), pointer :: pot4(:,:,:), pot5(:,:,:), pot6(:,:,:)
00047 real(long), pointer :: bk1(:,:,:), bk2(:,:,:), bk3(:,:,:)
00048 real(long), pointer :: bk4(:,:,:), bk5(:,:,:), bk6(:,:,:)
00049 real(long), pointer :: work(:,:,:)
00050
00051 real(long) :: error_emd, count
00052 integer :: iter_count, flag = 0, hydro_iter = 4
00053 integer :: irf, itf, ipf, irg, itg, ipg, ihy
00054
00055 real(long) :: error_all(20)
00056 integer :: flag_all(20) = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/)
00057
00058 call alloc_array3d(sou,0,nrg,0,ntg,0,npg)
00059 call alloc_array3d(pot,0,nrg,0,ntg,0,npg)
00060 call alloc_array3d(potf,0,nrf,0,ntf,0,npf)
00061 call alloc_array3d(emd_bak,0,nrf,0,ntf,0,npf)
00062 call alloc_array2d(potrs,0,ntf,0,npf)
00063 call alloc_array3d(potx,0,nrg,0,ntg,0,npg)
00064 call alloc_array3d(poty,0,nrg,0,ntg,0,npg)
00065 call alloc_array3d(potz,0,nrg,0,ntg,0,npg)
00066 call alloc_array4d(souvec,0,nrg,0,ntg,0,npg,1,3)
00067 call alloc_array4d(souten,0,nrg,0,ntg,0,npg,1,6)
00068 call alloc_array3d(sou1,0,nrg,0,ntg,0,npg)
00069 call alloc_array3d(sou2,0,nrg,0,ntg,0,npg)
00070 call alloc_array3d(sou3,0,nrg,0,ntg,0,npg)
00071 call alloc_array3d(sou4,0,nrg,0,ntg,0,npg)
00072 call alloc_array3d(sou5,0,nrg,0,ntg,0,npg)
00073 call alloc_array3d(sou6,0,nrg,0,ntg,0,npg)
00074 call alloc_array3d(pot1,0,nrg,0,ntg,0,npg)
00075 call alloc_array3d(pot2,0,nrg,0,ntg,0,npg)
00076 call alloc_array3d(pot3,0,nrg,0,ntg,0,npg)
00077 call alloc_array3d(pot4,0,nrg,0,ntg,0,npg)
00078 call alloc_array3d(pot5,0,nrg,0,ntg,0,npg)
00079 call alloc_array3d(pot6,0,nrg,0,ntg,0,npg)
00080 call alloc_array3d(pot_bak,0,nrg,0,ntg,0,npg)
00081 call alloc_array3d(potx_bak,0,nrg,0,ntg,0,npg)
00082 call alloc_array3d(poty_bak,0,nrg,0,ntg,0,npg)
00083 call alloc_array3d(potz_bak,0,nrg,0,ntg,0,npg)
00084 call alloc_array3d(bk1,0,nrg,0,ntg,0,npg)
00085 call alloc_array3d(bk2,0,nrg,0,ntg,0,npg)
00086 call alloc_array3d(bk3,0,nrg,0,ntg,0,npg)
00087 call alloc_array3d(bk4,0,nrg,0,ntg,0,npg)
00088 call alloc_array3d(bk5,0,nrg,0,ntg,0,npg)
00089 call alloc_array3d(bk6,0,nrg,0,ntg,0,npg)
00090 call alloc_array3d(work,0,nrg,0,ntg,0,npg)
00091
00092 iter_count = 0
00093 do
00094 iter_count = iter_count + 1
00095 count = dble(iter_count)
00096 conv_gra = dmin1(conv0_gra,conv_ini*count)
00097 conv_den = dmin1(conv0_den,conv_ini*count)
00098
00099 emdg = 0.0d0
00100 call calc_vector_x_grav(1)
00101 call calc_vector_x_matter(1)
00102 call calc_vector_phi_grav(1)
00103 call calc_vector_phi_matter(1)
00104 call interpo_fl2gr(emd, emdg)
00105 call calc_shift_down2up
00106 call interpo_gr2fl_metric_WL
00107 call rotation_law_WL
00108 call calc_shift2rotshift
00109 call SEM_tensor
00110
00111
00112 if (chgra == 'i') call cleargeometry
00113 if (chgra /= 'i') then
00114 call cristoffel_midpoint
00115 call cristoffel_gridpoint
00116 call riccitensor_midpoint
00117 end if
00118 if (chgra == 'h'.or.chgra == 'c'.or.chgra == 'C' &
00119 &.or.chgra == 'H'.or.chgra == 'W') then
00120 call liegmab_midpoint
00121 call liegmab_gridpoint
00122 end if
00123
00124 call excurve_WL_midpoint
00125 call excurve_WL_gridpoint
00126 call ap2alps
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 call source_HaC_WL(sou1)
00152 call poisson_solver(sou1,pot1)
00153 pot1(0:nrg,0:ntg,0:npg) = pot1(0:nrg,0:ntg,0:npg) + 1.0d0
00154
00155
00156 call source_trG_WL(sou2)
00157 call poisson_solver(sou2,pot2)
00158 pot2(0:nrg,0:ntg,0:npg) = pot2(0:nrg,0:ntg,0:npg) + 1.0d0
00159
00160
00161 pot_bak(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00162 call update_grfield(pot1,psi,conv_gra)
00163 call update_parameter_WL_peos(conv_den)
00164 call error_metric_type0(psi,pot_bak,error_all(1),flag_all(1),'ns')
00165
00166 pot_bak(0:nrg,0:ntg,0:npg) = alph(0:nrg,0:ntg,0:npg)
00167 call compute_alps2alph(pot2,psi)
00168 call update_grfield(pot2,alph,conv_gra)
00169 call update_parameter_WL_peos(conv_den)
00170 call error_metric_type0(alph,pot_bak,error_all(2),flag_all(2),'ns')
00171
00172
00173 call printout_error_metric_combined_2(iter_count,error_all(1),error_all(2))
00174
00175
00176 call source_MoC_WL(souvec)
00177
00178
00179
00180
00181 sou1(1:nrg, 1:ntg, 1:npg) = souvec(1:nrg, 1:ntg, 1:npg, 1)
00182 call poisson_solver(sou1,potx)
00183
00184
00185
00186 sou2(1:nrg, 1:ntg, 1:npg) = souvec(1:nrg, 1:ntg, 1:npg, 2)
00187 call poisson_solver(sou2,poty)
00188
00189
00190
00191 sou3(1:nrg, 1:ntg, 1:npg) = souvec(1:nrg, 1:ntg, 1:npg, 3)
00192 call poisson_solver(sou3,potz)
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 potx_bak(0:nrg,0:ntg,0:npg) = bvxd(0:nrg,0:ntg,0:npg)
00205 poty_bak(0:nrg,0:ntg,0:npg) = bvyd(0:nrg,0:ntg,0:npg)
00206 potz_bak(0:nrg,0:ntg,0:npg) = bvzd(0:nrg,0:ntg,0:npg)
00207 call update_grfield(potx,bvxd,conv_gra)
00208 call update_grfield(poty,bvyd,conv_gra)
00209 call update_grfield(potz,bvzd,conv_gra)
00210 call update_parameter_WL_peos(conv_den)
00211 call error_metric_type2(bvxd,potx_bak,error_all(3),flag_all(3),'ns')
00212 call error_metric_type2(bvyd,poty_bak,error_all(4),flag_all(4),'ns')
00213 call error_metric_type2(bvzd,potz_bak,error_all(5),flag_all(5),'ns')
00214 call printout_error_metric_combined_3(iter_count,error_all(3), &
00215 & error_all(4),error_all(5))
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 call source_trfreeG_WL(souten)
00229
00230
00231
00232
00233
00234 pot_bak(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00235 bk1(0:nrg,0:ntg,0:npg) = hxxd(0:nrg,0:ntg,0:npg)
00236 bk2(0:nrg,0:ntg,0:npg) = hxyd(0:nrg,0:ntg,0:npg)
00237 bk3(0:nrg,0:ntg,0:npg) = hxzd(0:nrg,0:ntg,0:npg)
00238 bk4(0:nrg,0:ntg,0:npg) = hyyd(0:nrg,0:ntg,0:npg)
00239 bk5(0:nrg,0:ntg,0:npg) = hyzd(0:nrg,0:ntg,0:npg)
00240 bk6(0:nrg,0:ntg,0:npg) = hzzd(0:nrg,0:ntg,0:npg)
00241 hxxd(0:nrg,0:ntg,0:npg) = 0.0d0
00242 hxyd(0:nrg,0:ntg,0:npg) = 0.0d0
00243 hxzd(0:nrg,0:ntg,0:npg) = 0.0d0
00244 hyyd(0:nrg,0:ntg,0:npg) = 0.0d0
00245 hyzd(0:nrg,0:ntg,0:npg) = 0.0d0
00246 hzzd(0:nrg,0:ntg,0:npg) = 0.0d0
00247
00248
00249
00250 if (chope == 'L') then
00251
00252 sou1(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,1)
00253 sou2(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,2)
00254 sou3(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,3)
00255 sou4(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,4)
00256 sou5(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,5)
00257 sou6(0:nrg,0:ntg,0:npg) = souten(0:nrg,0:ntg,0:npg,6)
00258
00259
00260 call poisson_solver(sou1,pot1)
00261
00262 call poisson_solver(sou2,pot2)
00263
00264 call poisson_solver(sou3,pot3)
00265
00266 call poisson_solver(sou4,pot4)
00267
00268 call poisson_solver(sou5,pot5)
00269
00270 call poisson_solver(sou6,pot6)
00271
00272
00273 end if
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 hxxd(0:nrg,0:ntg,0:npg) = pot1(0:nrg,0:ntg,0:npg)
00288 hxyd(0:nrg,0:ntg,0:npg) = pot2(0:nrg,0:ntg,0:npg)
00289 hxzd(0:nrg,0:ntg,0:npg) = pot3(0:nrg,0:ntg,0:npg)
00290 hyyd(0:nrg,0:ntg,0:npg) = pot4(0:nrg,0:ntg,0:npg)
00291 hyzd(0:nrg,0:ntg,0:npg) = pot5(0:nrg,0:ntg,0:npg)
00292 hzzd(0:nrg,0:ntg,0:npg) = pot6(0:nrg,0:ntg,0:npg)
00293
00294
00295
00296
00297
00298
00299
00300 call invhij
00301 call gauge_hiju(conv_gra)
00302 call invhij_up2down
00303 call adjusthij
00304
00305
00306
00307 pot(0:nrg,0:ntg,0:npg) = psi(0:nrg,0:ntg,0:npg)
00308 pot1(0:nrg,0:ntg,0:npg) = hxxd(0:nrg,0:ntg,0:npg)
00309 pot2(0:nrg,0:ntg,0:npg) = hxyd(0:nrg,0:ntg,0:npg)
00310 pot3(0:nrg,0:ntg,0:npg) = hxzd(0:nrg,0:ntg,0:npg)
00311 pot4(0:nrg,0:ntg,0:npg) = hyyd(0:nrg,0:ntg,0:npg)
00312 pot5(0:nrg,0:ntg,0:npg) = hyzd(0:nrg,0:ntg,0:npg)
00313 pot6(0:nrg,0:ntg,0:npg) = hzzd(0:nrg,0:ntg,0:npg)
00314
00315 psi(0:nrg,0:ntg,0:npg) = pot_bak(0:nrg,0:ntg,0:npg)
00316 hxxd(0:nrg,0:ntg,0:npg) = bk1(0:nrg,0:ntg,0:npg)
00317 hxyd(0:nrg,0:ntg,0:npg) = bk2(0:nrg,0:ntg,0:npg)
00318 hxzd(0:nrg,0:ntg,0:npg) = bk3(0:nrg,0:ntg,0:npg)
00319 hyyd(0:nrg,0:ntg,0:npg) = bk4(0:nrg,0:ntg,0:npg)
00320 hyzd(0:nrg,0:ntg,0:npg) = bk5(0:nrg,0:ntg,0:npg)
00321 hzzd(0:nrg,0:ntg,0:npg) = bk6(0:nrg,0:ntg,0:npg)
00322
00323 call update_grfield(pot_bak,psi,conv_gra)
00324
00325 call update_grfield(pot1,hxxd,conv_gra)
00326 call update_grfield(pot2,hxyd,conv_gra)
00327 call update_grfield(pot3,hxzd,conv_gra)
00328 call update_grfield(pot4,hyyd,conv_gra)
00329 call update_grfield(pot5,hyzd,conv_gra)
00330 call update_grfield(pot6,hzzd,conv_gra)
00331
00332
00333
00334
00335
00336
00337
00338 call invhij
00339 call compute_fnc_multiple(alph,psi,alps)
00340
00341 call update_parameter_WL_peos(conv_den)
00342 call error_metric_type2(hxxd,bk1,error_all(6),flag_all(6),'ns')
00343 call error_metric_type2(hxyd,bk2,error_all(7),flag_all(7),'ns')
00344 call error_metric_type2(hxzd,bk3,error_all(8),flag_all(8),'ns')
00345 call error_metric_type2(hyyd,bk4,error_all(9),flag_all(9),'ns')
00346 call error_metric_type2(hyzd,bk5,error_all(10),flag_all(10),'ns')
00347 call error_metric_type2(hzzd,bk6,error_all(11),flag_all(11),'ns')
00348 call printout_error_metric_combined_3(iter_count,error_all(6), &
00349 & error_all(7),error_all(8))
00350 call printout_error_metric_combined_3(iter_count,error_all(9), &
00351 & error_all(10),error_all(11))
00352
00353
00354
00355 itg = ntg/2-2; ipg = npg/2-2
00356 open(16,file='test_vec2',status='unknown')
00357 do irg = 0, nrg
00358 write(16,'(1p,12e20.12)') rg(irg), psi(irg,itg,ipg) &
00359 & , alph(irg,itg,ipg) &
00360 & , bvxd(irg,itg,ipg) &
00361 & , bvyd(irg,itg,ipg) &
00362 & , bvzd(irg,itg,ipg) &
00363 & , hxxd(irg,itg,ipg) &
00364 & , hxyd(irg,itg,ipg) &
00365 & , hxzd(irg,itg,ipg) &
00366 & , hyyd(irg,itg,ipg) &
00367 & , hyzd(irg,itg,ipg) &
00368 & , hzzd(irg,itg,ipg)
00369 end do
00370 close(16)
00371
00372
00373
00374 9000 continue
00375
00376
00377
00378
00379 do ihy = 1, hydro_iter
00380 if (ihy.eq.1) emd_bak = emd
00381 call interpo_gr2fl_metric_WL
00382 call rotation_law_WL
00383 call hydrostatic_eq_WL_peos(potf)
00384 call calc_surface(potrs, potf)
00385 call update_matter(potf,emd,conv_den)
00386 call update_surface(potrs,rs,conv_den)
00387 call reset_fluid
00388 call update_parameter_WL_peos(conv_den)
00389 call calc_vector_x_matter(1)
00390 call calc_vector_phi_matter(1)
00391
00392 if (ihy.eq.hydro_iter) then
00393 call error_matter(emd,emd_bak,error_all(12),flag_all(12))
00394 call printout_error(iter_count,error_all(12))
00395 end if
00396 end do
00397
00398
00399
00400
00401
00402
00403
00404
00405 if (flag_all(12)==0) exit
00406 if (iter_count >= iter_max) exit
00407 flag = 0
00408 flag_all(1:20) = 0
00409
00410 end do
00411
00412 deallocate(sou)
00413 deallocate(pot)
00414 deallocate(potf)
00415 deallocate(emd_bak)
00416 deallocate(potrs)
00417 deallocate(potx)
00418 deallocate(poty)
00419 deallocate(potz)
00420 deallocate(souvec)
00421 deallocate(souten)
00422 deallocate(sou1)
00423 deallocate(sou2)
00424 deallocate(sou3)
00425 deallocate(sou4)
00426 deallocate(sou5)
00427 deallocate(sou6)
00428 deallocate(pot1)
00429 deallocate(pot2)
00430 deallocate(pot3)
00431 deallocate(pot4)
00432 deallocate(pot5)
00433 deallocate(pot6)
00434 deallocate(pot_bak)
00435 deallocate(potx_bak)
00436 deallocate(poty_bak)
00437 deallocate(potz_bak)
00438 deallocate(bk1)
00439 deallocate(bk2)
00440 deallocate(bk3)
00441 deallocate(bk4)
00442 deallocate(bk5)
00443 deallocate(bk6)
00444 deallocate(work)
00445 end subroutine iteration_WL