Changeset 2028
- Timestamp:
- Apr 30, 2014, 4:14:49 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dyn3dmem/guide_loc_mod.F90
r2021 r2028 535 535 IF (f_out) THEN 536 536 ! Calcul niveaux pression milieu de couches 537 538 537 CALL pression_loc( ijnb_u, ap, bp, ps, p ) 538 if (pressure_exner) then 539 539 CALL exner_hyb_loc(ip1jmp1,ps,p,pks,pk) 540 540 else 541 541 CALL exner_milieu_loc(ip1jmp1,ps,p,pks,pk) 542 542 endif … … 544 544 unskap=1./kappa 545 545 !$OMP DO 546 DO l = 1, llm 547 DO j=jjbu,jjeu 548 DO i =1, iip1 549 p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap 550 ENDDO 551 ENDDO 552 ENDDO 553 !$OMP MASTER 554 CALL guide_out("P",jjp1,llm,p,1.) 555 !$OMP END MASTER 556 !$OMP BARRIER 546 DO l = 1, llm 547 DO j=jjbu,jjeu 548 DO i =1, iip1 549 p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap 550 ENDDO 551 ENDDO 552 ENDDO 553 CALL guide_out("SP",jjp1,llm,p,1.) 557 554 ENDIF 558 555 … … 574 571 if (guide_zon) CALL guide_zonave_u(1,llm,f_addu) 575 572 CALL guide_addfield_u(llm,f_addu,alpha_u) 576 ! CALL WriteField_u('f_addu',f_addu) 577 ! CALL WriteField_u('alpha_u',alpha_u) 578 !$OMP MASTER 579 IF (f_out) CALL guide_out("U",jjp1,llm,f_addu(:,:),factt) 580 !$OMP END MASTER 581 !$OMP BARRIER 582 573 ! IF (f_out) CALL guide_out("ua",jjp1,llm,ugui1(ijb_u:ije_u,:),factt) 574 IF (f_out) CALL guide_out("ua",jjp1,llm,(1.-tau)*ugui1(ijb_u:ije_u,:)+tau*ugui2(ijb_u:ije_u,:),factt) 575 IF (f_out) CALL guide_out("u",jjp1,llm,ucov(ijb_u:ije_u,:),factt) 576 IF (f_out) CALL guide_out("ucov",jjp1,llm,f_addu(ijb_u:ije_u,:),factt) 583 577 !$OMP DO 584 578 DO l=1,llm … … 602 596 if (guide_zon) CALL guide_zonave_u(2,llm,f_addu) 603 597 CALL guide_addfield_u(llm,f_addu,alpha_T) 604 !$OMP MASTER 605 IF (f_out) CALL guide_out("T",jjp1,llm,f_addu(:,:),factt) 606 !$OMP END MASTER 607 !$OMP BARRIER 598 IF (f_out) CALL guide_out("teta",jjp1,llm,f_addu(:,:)/factt,factt) 608 599 !$OMP DO 609 600 DO l=1,llm … … 626 617 if (guide_zon) CALL guide_zonave_u(2,1,f_addu(ijb_u:ije_u,1)) 627 618 CALL guide_addfield_u(1,f_addu(ijb_u:ije_u,1),alpha_P) 628 !$OMP MASTER 629 IF (f_out) CALL guide_out("SP",jjp1,1,f_addu(1:ip1jmp1,1),factt) 630 !$OMP END MASTER 631 !$OMP BARRIER 619 IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(1:ip1jmp1,1)/factt,factt) 632 620 !$OMP MASTER 633 621 ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_addu(ijbu:ijeu,1) … … 653 641 if (guide_zon) CALL guide_zonave_u(2,llm,f_addu) 654 642 CALL guide_addfield_u(llm,f_addu,alpha_Q) 655 !$OMP MASTER 656 IF (f_out) CALL guide_out("Q",jjp1,llm,f_addu(:,:),factt) 657 !$OMP END MASTER 658 !$OMP BARRIER 643 IF (f_out) CALL guide_out("q",jjp1,llm,f_addu(:,:)/factt,factt) 659 644 660 645 !$OMP DO … … 678 663 679 664 endif 680 ! CALL WriteField_v('f_addv',f_addv)681 665 682 666 if (guide_zon) CALL guide_zonave_v(2,jjm,llm,f_addv(ijb_v:ije_v,:)) 683 ! CALL WriteField_v('f_addv',f_addv)684 667 685 668 CALL guide_addfield_v(llm,f_addv(ijb_v:ije_v,:),alpha_v) 686 ! CALL WriteField_v('f_addv',f_addv) 687 ! CALL WriteField_v('alpha_v',alpha_v) 688 !$OMP MASTER 689 IF (f_out) CALL guide_out("V",jjm,llm,f_addv(1:ip1jm,:),factt) 690 !$OMP END MASTER 691 !$OMP BARRIER 692 ! CALL WriteField_v('f_addv',f_addv) 669 IF (f_out) CALL guide_out("v",jjm,llm,vcov(ijb_v:ije_v,:),factt) 670 IF (f_out) CALL guide_out("va",jjm,llm,(1.-tau)*vgui1(ijb_v:ije_v,:)+tau*vgui2(ijb_v:ije_v,:),factt) 671 IF (f_out) CALL guide_out("vcov",jjm,llm,f_addv(:,:)/factt,factt) 693 672 694 673 !$OMP DO … … 697 676 ENDDO 698 677 endif 699 700 ! CALL WriteField_u('ucov_guide',ucov)701 ! CALL WriteField_v('vcov_guide',vcov)702 ! CALL WriteField_u('teta_guide',teta)703 ! CALL WriteField_u('masse_guide',masse)704 678 705 679 END SUBROUTINE guide_main … … 1022 996 DO i =1, iip1 1023 997 pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(bp(l)+bp(l+1))/2. 1024 1025 998 ENDDO 999 ENDDO 1026 1000 ENDDO 1027 1001 ELSE 1028 1029 1002 CALL pression_loc( ijnb_u, ap, bp, psi, p ) 1003 if (disvert_type==1) then 1030 1004 CALL exner_hyb_loc(ijnb_u,psi,p,pks,pk) 1031 1005 else ! we assume that we are in the disvert_type==2 case 1032 1006 CALL exner_milieu_loc(ijnb_u,psi,p,pks,pk) 1033 1007 endif 1034 1035 !$OMP BARRIER 1036 !$OMP DO 1037 1038 1039 1040 1041 1042 1043 1008 unskap=1./kappa 1009 !$OMP BARRIER 1010 !$OMP DO 1011 DO l = 1, llm 1012 DO j=jjbu,jjeu 1013 DO i =1, iip1 1014 pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap 1015 ENDDO 1016 ENDDO 1017 ENDDO 1044 1018 ENDIF 1045 1019 … … 1751 1725 endif 1752 1726 1727 1753 1728 ! Temperature 1754 1729 if (guide_T) then … … 1904 1879 if (ncidpl.eq.-99) ncidpl=ncidu 1905 1880 endif 1881 1906 1882 ! Vent meridien 1907 1883 if (guide_v) then … … 2041 2017 endif 2042 2018 2019 2043 2020 ! Temperature 2044 2021 if (guide_T) then … … 2126 2103 2127 2104 !======================================================================= 2128 SUBROUTINE guide_out(varname,hsize,vsize,field ,factt)2105 SUBROUTINE guide_out(varname,hsize,vsize,field_loc,factt) 2129 2106 USE parallel_lmdz 2107 USE mod_hallo, ONLY : gather_field_u, gather_field_v 2130 2108 IMPLICIT NONE 2131 2109 … … 2138 2116 2139 2117 ! Variables entree 2140 CHARACTER , INTENT(IN):: varname2118 CHARACTER*(*), INTENT(IN) :: varname 2141 2119 INTEGER, INTENT (IN) :: hsize,vsize 2142 REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field 2120 REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc 2143 2121 REAL, INTENT (IN) :: factt 2144 2122 … … 2148 2126 INTEGER :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev 2149 2127 INTEGER :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev 2128 INTEGER :: vid_au,vid_av 2150 2129 INTEGER, DIMENSION (3) :: dim3 2151 2130 INTEGER, DIMENSION (4) :: dim4,count,start 2152 INTEGER :: ierr, varid 2153 2154 CALL gather_field(field,iip1*hsize,vsize,0) 2155 2131 INTEGER :: ierr, varid,l 2132 REAL zu(ip1jmp1),zv(ip1jm) 2133 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: field_glo 2134 2135 !$OMP MASTER 2136 2137 ALLOCATE(field_glo(iip1,hsize,vsize)) 2138 IF (hsize==jjp1) THEN 2139 CALL gather_field_u(field_loc,field_glo,vsize) 2140 ELSE IF (hsize==jjm) THEN 2141 CALL gather_field_v(field_loc,field_glo, vsize) 2142 ENDIF 2143 2144 CALL Gather_field_u(alpha_u,zu,1) 2145 CALL Gather_field_v(alpha_v,zv,1) 2146 2156 2147 IF (mpi_rank /= 0) RETURN 2157 2148 2158 2149 ! print *,'Guide: output timestep',timestep,'var ',varname 2159 2150 IF (timestep.EQ.0) THEN 2160 2151 ! ---------------------------------------------- … … 2179 2170 ierr=NF_DEF_VAR(nid,"cu",NF_FLOAT,2,(/id_lonu,id_latu/),vid_cu) 2180 2171 ierr=NF_DEF_VAR(nid,"cv",NF_FLOAT,2,(/id_lonv,id_latv/),vid_cv) 2181 2172 ierr=NF_DEF_VAR(nid,"au",NF_FLOAT,2,(/id_lonu,id_latu/),vid_au) 2173 ierr=NF_DEF_VAR(nid,"av",NF_FLOAT,2,(/id_lonv,id_latv/),vid_av) 2174 2182 2175 ierr=NF_ENDDEF(nid) 2183 2176 … … 2191 2184 ierr = NF_PUT_VAR_DOUBLE(nid,vid_cu,cu) 2192 2185 ierr = NF_PUT_VAR_DOUBLE(nid,vid_cv,cv) 2186 ierr = NF_PUT_VAR_DOUBLE(nid,vid_au,zu) 2187 ierr = NF_PUT_VAR_DOUBLE(nid,vid_av,zv) 2193 2188 #else 2194 2189 ierr = NF_PUT_VAR_REAL(nid,vid_lonu,rlonu*180./pi) … … 2199 2194 ierr = NF_PUT_VAR_REAL(nid,vid_cu,cu) 2200 2195 ierr = NF_PUT_VAR_REAL(nid,vid_cv,cv) 2196 ierr = NF_PUT_VAR_REAL(nid,vid_au,alpha_u) 2197 ierr = NF_PUT_VAR_REAL(nid,vid_av,alpha_v) 2201 2198 #endif 2202 2199 ! -------------------------------------------------------------------- … … 2206 2203 ! Pressure (GCM) 2207 2204 dim4=(/id_lonv,id_latu,id_lev,id_tim/) 2208 ierr = NF_DEF_VAR(nid," P",NF_FLOAT,4,dim4,varid)2205 ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,4,dim4,varid) 2209 2206 ! Surface pressure (guidage) 2210 2207 IF (guide_P) THEN … … 2215 2212 IF (guide_u) THEN 2216 2213 dim4=(/id_lonu,id_latu,id_lev,id_tim/) 2214 ierr = NF_DEF_VAR(nid,"u",NF_FLOAT,4,dim4,varid) 2215 ierr = NF_DEF_VAR(nid,"ua",NF_FLOAT,4,dim4,varid) 2217 2216 ierr = NF_DEF_VAR(nid,"ucov",NF_FLOAT,4,dim4,varid) 2218 2217 ENDIF … … 2220 2219 IF (guide_v) THEN 2221 2220 dim4=(/id_lonv,id_latv,id_lev,id_tim/) 2221 ierr = NF_DEF_VAR(nid,"v",NF_FLOAT,4,dim4,varid) 2222 ierr = NF_DEF_VAR(nid,"va",NF_FLOAT,4,dim4,varid) 2222 2223 ierr = NF_DEF_VAR(nid,"vcov",NF_FLOAT,4,dim4,varid) 2223 2224 ENDIF … … 2243 2244 ierr=NF_OPEN("guide_ins.nc",NF_WRITE,nid) 2244 2245 2246 IF (varname=="SP") timestep=timestep+1 2247 2248 ierr = NF_INQ_VARID(nid,varname,varid) 2245 2249 SELECT CASE (varname) 2246 CASE ("P") 2247 timestep=timestep+1 2248 ierr = NF_INQ_VARID(nid,"P",varid) 2250 CASE ("SP","ps") 2249 2251 start=(/1,1,1,timestep/) 2250 2252 count=(/iip1,jjp1,llm,1/) 2251 #ifdef NC_DOUBLE 2252 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field) 2253 #else 2254 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field) 2255 #endif 2256 CASE ("SP") 2257 ierr = NF_INQ_VARID(nid,"ps",varid) 2258 start=(/1,1,timestep,0/) 2259 count=(/iip1,jjp1,1,0/) 2260 #ifdef NC_DOUBLE 2261 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt) 2262 #else 2263 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt) 2264 #endif 2265 CASE ("U") 2266 ierr = NF_INQ_VARID(nid,"ucov",varid) 2253 CASE ("v","va","vcov") 2254 start=(/1,1,1,timestep/) 2255 count=(/iip1,jjm,llm,1/) 2256 CASE DEFAULT 2267 2257 start=(/1,1,1,timestep/) 2268 2258 count=(/iip1,jjp1,llm,1/) 2259 END SELECT 2260 2261 SELECT CASE (varname) 2262 2263 CASE("u","ua") 2264 DO l=1,llm ; field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/cu(:,2:jjm) ; ENDDO 2265 field_glo(:,1,:)=0. ; field_glo(:,jjp1,:)=0. 2266 CASE("v","va") 2267 DO l=1,llm ; field_glo(:,:,l)=field_glo(:,:,l)/cv(:,:) ; ENDDO 2268 END SELECT 2269 2270 ! if (varname=="ua") then 2271 ! call dump2d(iip1,jjp1,field_glo,'ua gui1 1ere couche ') 2272 ! call dump2d(iip1,jjp1,field_glo(:,:,llm),'ua gui1 llm ') 2273 ! endif 2269 2274 #ifdef NC_DOUBLE 2270 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt)2275 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field_glo) 2271 2276 #else 2272 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt)2277 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field_glo) 2273 2278 #endif 2274 CASE ("V") 2275 ierr = NF_INQ_VARID(nid,"vcov",varid) 2276 start=(/1,1,1,timestep/) 2277 count=(/iip1,jjm,llm,1/) 2278 #ifdef NC_DOUBLE 2279 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt) 2280 #else 2281 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt) 2282 #endif 2283 CASE ("T") 2284 ierr = NF_INQ_VARID(nid,"teta",varid) 2285 start=(/1,1,1,timestep/) 2286 count=(/iip1,jjp1,llm,1/) 2287 #ifdef NC_DOUBLE 2288 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt) 2289 #else 2290 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt) 2291 #endif 2292 CASE ("Q") 2293 ierr = NF_INQ_VARID(nid,"q",varid) 2294 start=(/1,1,1,timestep/) 2295 count=(/iip1,jjp1,llm,1/) 2296 #ifdef NC_DOUBLE 2297 ierr = NF_PUT_VARA_DOUBLE(nid,varid,start,count,field/factt) 2298 #else 2299 ierr = NF_PUT_VARA_REAL(nid,varid,start,count,field/factt) 2300 #endif 2301 END SELECT 2302 2279 2303 2280 ierr = NF_CLOSE(nid) 2281 2282 2283 !$OMP END MASTER 2284 !$OMP BARRIER 2285 2286 RETURN 2304 2287 2305 2288 END SUBROUTINE guide_out … … 2325 2308 end subroutine correctbid 2326 2309 2310 2311 !==================================================================== 2312 ! Ascii debug output. Could be reactivated 2313 !==================================================================== 2314 2315 subroutine dump2du(var,varname) 2316 use parallel_lmdz 2317 use mod_hallo 2318 implicit none 2319 include 'dimensions.h' 2320 include 'paramet.h' 2321 2322 CHARACTER (len=*) :: varname 2323 2324 2325 real, dimension(ijb_u:ije_u) :: var 2326 2327 real, dimension(ip1jmp1) :: var_glob 2328 2329 RETURN 2330 2331 call barrier 2332 CALL Gather_field_u(var,var_glob,1) 2333 call barrier 2334 2335 if (mpi_rank==0) then 2336 call dump2d(iip1,jjp1,var_glob,varname) 2337 endif 2338 2339 call barrier 2340 2341 return 2342 end subroutine dump2du 2343 2344 !==================================================================== 2345 ! Ascii debug output. Could be reactivated 2346 !==================================================================== 2347 subroutine dumpall 2348 implicit none 2349 include "dimensions.h" 2350 include "paramet.h" 2351 include "comgeom.h" 2352 call barrier 2353 call dump2du(alpha_u(ijb_u:ije_u),' alpha_u couche 1') 2354 call dump2du(unat2(:,jjbu:jjeu,nlevnc),' unat2 couche nlevnc') 2355 call dump2du(ugui1(ijb_u:ije_u,1)*sqrt(unscu2(ijb_u:ije_u)),' ugui1 couche 1') 2356 return 2357 end subroutine dumpall 2358 2327 2359 !=========================================================================== 2328 2360 END MODULE guide_loc_mod
Note: See TracChangeset
for help on using the changeset viewer.