36 USE parallel, ONLY : omp_chunk, using_mpi
98 #include "dimensions.h"
105 #include "comconst.h"
107 #include "comgeom2.h"
108 #include "iniprint.h"
116 REAL,
intent(in):: jd_cur, jh_cur
117 REAL pvcov(iip1,jjm,llm)
118 REAL pucov(iip1,
jjp1,llm)
119 REAL pteta(iip1,
jjp1,llm)
120 REAL pmasse(iip1,
jjp1,llm)
121 REAL pq(iip1,
jjp1,llm,nqtot)
122 REAL pphis(iip1,
jjp1)
123 REAL pphi(iip1,
jjp1,llm)
125 REAL pdvcov(iip1,jjm,llm)
126 REAL pducov(iip1,
jjp1,llm)
127 REAL pdteta(iip1,
jjp1,llm)
128 REAL pdq(iip1,
jjp1,llm,nqtot)
129 REAL flxw(iip1,
jjp1,llm)
133 REAL ppk(iip1,
jjp1,llm)
135 REAL pdvfi(iip1,jjm,llm)
136 REAL pdufi(iip1,
jjp1,llm)
137 REAL pdhfi(iip1,
jjp1,llm)
138 REAL pdqfi(iip1,
jjp1,llm,nqtot)
139 REAL pdpsfi(iip1,
jjp1)
143 REAL clesphy0( longcles )
150 INTEGER i,
j,
l,ig0,ig,iq,iiq
151 REAL,
ALLOCATABLE,
SAVE :: zpsrf(:)
152 REAL,
ALLOCATABLE,
SAVE :: zplev(:,:),zplay(:,:)
153 REAL,
ALLOCATABLE,
SAVE :: zphi(:,:),zphis(:)
155 REAL,
ALLOCATABLE,
SAVE :: zufi(:,:), zvfi(:,:)
156 REAL,
ALLOCATABLE,
SAVE :: ztfi(:,:),zqfi(:,:,:)
158 REAL,
ALLOCATABLE,
SAVE :: pcvgu(:,:), pcvgv(:,:)
159 REAL,
ALLOCATABLE,
SAVE :: pcvgt(:,:), pcvgq(:,:,:)
161 REAL,
ALLOCATABLE,
SAVE :: zdufi(:,:),zdvfi(:,:)
162 REAL,
ALLOCATABLE,
SAVE :: zdtfi(:,:),zdqfi(:,:,:)
163 REAL,
ALLOCATABLE,
SAVE :: zdpsrf(:)
164 REAL,
SAVE,
ALLOCATABLE :: flxwfi(:,:)
167 REAL,
ALLOCATABLE,
SAVE :: zplev_omp(:,:)
168 REAL,
ALLOCATABLE,
SAVE :: zplay_omp(:,:)
169 REAL,
ALLOCATABLE,
SAVE :: zphi_omp(:,:)
170 REAL,
ALLOCATABLE,
SAVE :: zphis_omp(:)
171 REAL,
ALLOCATABLE,
SAVE :: presnivs_omp(:)
172 REAL,
ALLOCATABLE,
SAVE :: zufi_omp(:,:)
173 REAL,
ALLOCATABLE,
SAVE :: zvfi_omp(:,:)
174 REAL,
ALLOCATABLE,
SAVE :: ztfi_omp(:,:)
175 REAL,
ALLOCATABLE,
SAVE :: zqfi_omp(:,:,:)
176 REAL,
ALLOCATABLE,
SAVE :: zdufi_omp(:,:)
177 REAL,
ALLOCATABLE,
SAVE :: zdvfi_omp(:,:)
178 REAL,
ALLOCATABLE,
SAVE :: zdtfi_omp(:,:)
179 REAL,
ALLOCATABLE,
SAVE :: zdqfi_omp(:,:,:)
180 REAL,
ALLOCATABLE,
SAVE :: zdpsrf_omp(:)
181 REAL,
SAVE,
ALLOCATABLE :: flxwfi_omp(:,:)
196 REAL,
ALLOCATABLE,
SAVE :: zdufic_omp(:,:)
197 REAL,
ALLOCATABLE,
SAVE :: zdvfic_omp(:,:)
198 REAL,
ALLOCATABLE,
SAVE :: zdtfic_omp(:,:)
199 REAL,
ALLOCATABLE,
SAVE :: zdqfic_omp(:,:,:)
200 REAL jh_cur_split,zdt_split
201 LOGICAL debut_split,lafin_split
211 LOGICAL,
SAVE :: first_omp=.true.
215 REAL zsinbis(
iim),zcosbis(
iim),z1bis(
iim)
221 REAL rtetastd(ntetastd)
222 DATA rtetastd/350., 380., 405./
223 REAL pvteta(klon,ntetastd)
228 LOGICAL firstcal, debut
229 DATA firstcal/.true./
233 REAL,
SAVE,
dimension(1:iim,1:llm):: du_send,du_recv,dv_send,dv_recv
236 INTEGER,
dimension(MPI_STATUS_SIZE,4) :: status
238 INTEGER,
dimension(1,4) :: status
240 INTEGER,
dimension(4) :: req
241 REAL,
ALLOCATABLE,
SAVE:: zdufi2(:,:),zdvfi2(:,:)
242 integer ::
k,kstart,kend
260 IF (ngridmx.NE.2+(jjm-1)*
iim)
THEN
261 write(
lunout,*)
'STOP dans calfis'
263 &
'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim'
264 write(
lunout,*)
' ngridmx jjm iim '
269 ALLOCATE(zpsrf(klon))
270 ALLOCATE(zplev(klon,llm+1),zplay(klon,llm))
271 ALLOCATE(zphi(klon,llm),zphis(klon))
272 ALLOCATE(zufi(klon,llm), zvfi(klon,llm))
273 ALLOCATE(ztfi(klon,llm),zqfi(klon,llm,nqtot))
274 ALLOCATE(pcvgu(klon,llm), pcvgv(klon,llm))
275 ALLOCATE(pcvgt(klon,llm), pcvgq(klon,llm,2))
276 ALLOCATE(zdufi(klon,llm),zdvfi(klon,llm))
277 ALLOCATE(zdtfi(klon,llm),zdqfi(klon,llm,nqtot))
278 ALLOCATE(zdpsrf(klon))
279 ALLOCATE(zdufi2(klon+
iim,llm),zdvfi2(klon+
iim,llm))
280 ALLOCATE(flxwfi(klon,llm))
330 zplev( ig0,
l ) = pp(
i,
j,
l)
346 pksurcp = ppk(
i,
j,
l) /
cpp
347 zplay(ig0,
l) =
preff * pksurcp ** unskap
348 ztfi(ig0,
l) = pteta(
i,
j,
l) * pksurcp
367 zqfi(ig0,
l,iq) = pq(
i,
j,
l,iiq)
386 zphi(ig,
l)=zphi(ig,
l)-zphis(ig)
399 if (is_north_pole) kstart=2
400 if (is_south_pole) kend=klon-1
412 $ + pucov(1,
j,
l)/
cu(1,
j) )
414 zufi(ig0,
l)= 0.5*( pucov(
i-1,
j,
l)/
cu(
i-1,
j)
431 zvfi(ig0,
l)= 0.5 *( pvcov(
i,
j-1,
l)/
cv(
i,
j-1)
443 if (is_north_pole)
then
470 if (is_south_pole)
then
491 IF (is_sequential.and.(planet_type==
"earth"))
THEN
495 CALL
pvtheta(ngridmx,llm,pucov,pvcov,pteta,
497 $ ntetastd,rtetastd,pvteta)
514 allocate(zplev_omp(klon,llm+1))
515 allocate(zplay_omp(klon,llm))
516 allocate(zphi_omp(klon,llm))
517 allocate(zphis_omp(klon))
518 allocate(presnivs_omp(llm))
519 allocate(zufi_omp(klon,llm))
520 allocate(zvfi_omp(klon,llm))
521 allocate(ztfi_omp(klon,llm))
522 allocate(zqfi_omp(klon,llm,nqtot))
523 allocate(zdufi_omp(klon,llm))
524 allocate(zdvfi_omp(klon,llm))
525 allocate(zdtfi_omp(klon,llm))
526 allocate(zdqfi_omp(klon,llm,nqtot))
527 allocate(zdufic_omp(klon,llm))
528 allocate(zdvfic_omp(klon,llm))
529 allocate(zdtfic_omp(klon,llm))
530 allocate(zdqfic_omp(klon,llm,nqtot))
531 allocate(zdpsrf_omp(klon))
532 allocate(flxwfi_omp(klon,llm))
538 offset=klon_omp_begin-1
542 zplev_omp(
i,
l)=zplev(offset+
i,
l)
548 zplay_omp(
i,
l)=zplay(offset+
i,
l)
554 zphi_omp(
i,
l)=zphi(offset+
i,
l)
559 zphis_omp(
i)=zphis(offset+
i)
569 zufi_omp(
i,
l)=zufi(offset+
i,
l)
575 zvfi_omp(
i,
l)=zvfi(offset+
i,
l)
581 ztfi_omp(
i,
l)=ztfi(offset+
i,
l)
588 zqfi_omp(
i,
l,iq)=zqfi(offset+
i,
l,iq)
595 zdufi_omp(
i,
l)=zdufi(offset+
i,
l)
601 zdvfi_omp(
i,
l)=zdvfi(offset+
i,
l)
607 zdtfi_omp(
i,
l)=zdtfi(offset+
i,
l)
614 zdqfi_omp(
i,
l,iq)=zdqfi(offset+
i,
l,iq)
620 zdpsrf_omp(
i)=zdpsrf(offset+
i)
625 flxwfi_omp(
i,
l)=flxwfi(offset+
i,
l)
634 zdt_split=
dtphys/nsplit_phys
641 do isplit=1,nsplit_phys
643 jh_cur_split=jh_cur+(isplit-1) *
dtvr / (
daysec *nsplit_phys)
644 debut_split=debut.and.isplit==1
645 lafin_split=lafin.and.isplit==nsplit_phys
647 if (planet_type==
"earth")
then
678 else if ( planet_type==
"generic" )
then
707 zufi_omp(:,:)=zufi_omp(:,:)+zdufi_omp(:,:)*zdt_split
708 zvfi_omp(:,:)=zvfi_omp(:,:)+zdvfi_omp(:,:)*zdt_split
709 ztfi_omp(:,:)=ztfi_omp(:,:)+zdtfi_omp(:,:)*zdt_split
710 zqfi_omp(:,:,:)=zqfi_omp(:,:,:)+zdqfi_omp(:,:,:)*zdt_split
712 zdufic_omp(:,:)=zdufic_omp(:,:)+zdufi_omp(:,:)
713 zdvfic_omp(:,:)=zdvfic_omp(:,:)+zdvfi_omp(:,:)
714 zdtfic_omp(:,:)=zdtfic_omp(:,:)+zdtfi_omp(:,:)
715 zdqfic_omp(:,:,:)=zdqfic_omp(:,:,:)+zdqfi_omp(:,:,:)
722 zdufi_omp(:,:)=zdufic_omp(:,:)/nsplit_phys
723 zdvfi_omp(:,:)=zdvfic_omp(:,:)/nsplit_phys
724 zdtfi_omp(:,:)=zdtfic_omp(:,:)/nsplit_phys
725 zdqfi_omp(:,:,:)=zdqfic_omp(:,:,:)/nsplit_phys
730 zplev(offset+
i,
l)=zplev_omp(
i,
l)
736 zplay(offset+
i,
l)=zplay_omp(
i,
l)
742 zphi(offset+
i,
l)=zphi_omp(
i,
l)
748 zphis(offset+
i)=zphis_omp(
i)
758 zufi(offset+
i,
l)=zufi_omp(
i,
l)
764 zvfi(offset+
i,
l)=zvfi_omp(
i,
l)
770 ztfi(offset+
i,
l)=ztfi_omp(
i,
l)
777 zqfi(offset+
i,
l,iq)=zqfi_omp(
i,
l,iq)
784 zdufi(offset+
i,
l)=zdufi_omp(
i,
l)
790 zdvfi(offset+
i,
l)=zdvfi_omp(
i,
l)
796 zdtfi(offset+
i,
l)=zdtfi_omp(
i,
l)
803 zdqfi(offset+
i,
l,iq)=zdqfi_omp(
i,
l,iq)
809 zdpsrf(offset+
i)=zdpsrf_omp(
i)
836 call mpi_issend(du_send,
iim*llm,mpi_real8,mpi_rank-1,401,
837 & comm_lmdz,req(1),ierr)
838 call mpi_issend(dv_send,
iim*llm,mpi_real8,mpi_rank-1,402,
839 & comm_lmdz,req(2),ierr)
847 if (mpi_rank<mpi_size-1)
then
852 call mpi_irecv(du_recv,
iim*llm,mpi_real8,mpi_rank+1,401,
853 & comm_lmdz,req(3),ierr)
854 call mpi_irecv(dv_recv,
iim*llm,mpi_real8,mpi_rank+1,402,
855 & comm_lmdz,req(4),ierr)
867 if (mpi_rank>0 .and. mpi_rank< mpi_size-1)
then
868 call mpi_waitall(4,req(1),status,ierr)
869 else if (mpi_rank>0)
then
870 call mpi_waitall(2,req(1),status,ierr)
871 else if (mpi_rank <mpi_size-1)
then
872 call mpi_waitall(2,req(3),status,ierr)
886 zdufi2(1:klon,
l)=zdufi(1:klon,
l)
887 zdufi2(klon+1:klon+
iim,
l)=du_recv(1:
iim,
l)
889 zdvfi2(1:klon,
l)=zdvfi(1:klon,
l)
890 zdvfi2(klon+1:klon+
iim,
l)=dv_recv(1:
iim,
l)
892 pdhfi(:,jj_begin,
l)=0
893 pdqfi(:,jj_begin,
l,:)=0
894 pdufi(:,jj_begin,
l)=0
895 pdvfi(:,jj_begin,
l)=0
897 if (.not. is_south_pole)
then
899 pdqfi(:,jj_end,
l,:)=0
909 if (.not. is_south_pole)
then
927 if (is_north_pole) kstart=2
928 if (is_south_pole) kend=klon-1
939 pdhfi(
i,
j,
l) =
cpp * zdtfi(ig0,
l) / ppk(
i,
j,
l)
940 if (
i==1) pdhfi(iip1,
j,
l) =
cpp * zdtfi(ig0,
l) / ppk(
i,
j,
l)
943 if (is_north_pole)
then
945 pdhfi(
i,1,
l) =
cpp * zdtfi(1,
l) / ppk(
i, 1 ,
l)
949 if (is_south_pole)
then
1008 pdqfi(
i,
j,
l,iiq) = zdqfi(ig0,
l,iq)
1009 if (
i==1) pdqfi(iip1,
j,
l,iiq) = zdqfi(ig0,
l,iq)
1012 IF (is_north_pole)
then
1014 pdqfi(
i,1,
l,iiq) = zdqfi(1,
l,iq)
1018 IF (is_south_pole)
then
1020 pdqfi(
i,
jjp1,
l,iiq) = zdqfi(klon,
l,iq)
1040 pdufi(
i,
j,
l)=0.5*(zdufi2(ig0,
l)+zdufi2(ig0+1,
l))*
cu(
i,
j)
1044 pdufi(
iim,
j,
l)=0.5*( zdufi2(ig0,
l)
1046 pdufi(iip1,
j,
l)=0.5*(zdufi2(ig0,
l)+zdufi2(ig0+1,
l))*
cu(
i,
j)
1051 if (is_north_pole)
then
1057 if (is_south_pole)
then
1072 if (is_north_pole) kstart=2
1073 if (is_south_pole) kend=klon-1-
iim
1083 pdvfi(
i,
j,
l)=0.5*(zdvfi2(ig0,
l)+zdvfi2(ig0+
iim,
l))*
cv(
i,
j)
1084 if (
i==1) pdvfi(iip1,
j,
l) = 0.5*(zdvfi2(ig0,
l)+
1085 $ zdvfi2(ig0+
iim,
l))
1097 if (is_north_pole)
then
1107 $ 0.5*(pdvfi(
i,1,
l)+zdvfi(
i+1,
l))*
cv(
i,1)
1110 pdvfi(iip1,1,
l) = pdvfi(1,1,
l)
1117 if (is_south_pole)
then
1123 pdvfi(
i,jjm,
l)=zdufi(klon,
l)*cos(
rlonv(
i))
1124 $ +zdvfi(klon,
l)*sin(
rlonv(
i))
1127 $ 0.5*(pdvfi(
i,jjm,
l)+zdvfi(klon-iip1+
i,
l))*
cv(
i,jjm)
1130 pdvfi(iip1,jjm,
l)= pdvfi(1,jjm,
l)
1144 &
"calfis_p: for now can only work with parallel physics"