39 USE parallel, ONLY : omp_chunk, using_mpi,jjb_u,jje_u,jjb_v,jje_v
101 #include "dimensions.h"
108 #include "comconst.h"
110 #include "comgeom2.h"
111 #include "iniprint.h"
119 REAL,
intent(in):: jd_cur, jh_cur
120 REAL pvcov(iip1,jjb_v:jje_v,llm)
121 REAL pucov(iip1,jjb_u:jje_u,llm)
122 REAL pteta(iip1,jjb_u:jje_u,llm)
123 REAL pmasse(iip1,jjb_u:jje_u,llm)
124 REAL pq(iip1,jjb_u:jje_u,llm,nqtot)
125 REAL pphis(iip1,jjb_u:jje_u)
126 REAL pphi(iip1,jjb_u:jje_u,llm)
128 REAL pdvcov(iip1,jjb_v:jje_v,llm)
129 REAL pducov(iip1,jjb_u:jje_u,llm)
130 REAL pdteta(iip1,jjb_u:jje_u,llm)
131 REAL pdq(iip1,jjb_u:jje_u,llm,nqtot)
132 REAL flxw(iip1,jjb_u:jje_u,llm)
134 REAL pps(iip1,jjb_u:jje_u)
135 REAL pp(iip1,jjb_u:jje_u,
llmp1)
136 REAL ppk(iip1,jjb_u:jje_u,llm)
138 REAL pdvfi(iip1,jjb_v:jje_v,llm)
139 REAL pdufi(iip1,jjb_u:jje_u,llm)
140 REAL pdhfi(iip1,jjb_u:jje_u,llm)
141 REAL pdqfi(iip1,jjb_u:jje_u,llm,nqtot)
142 REAL pdpsfi(iip1,jjb_u:jje_u)
146 REAL clesphy0( longcles )
154 INTEGER i,
j,
l,ig0,ig,iq,iiq
155 REAL,
ALLOCATABLE,
SAVE :: zpsrf(:)
156 REAL,
ALLOCATABLE,
SAVE :: zplev(:,:),zplay(:,:)
157 REAL,
ALLOCATABLE,
SAVE :: zphi(:,:),zphis(:)
159 REAL,
ALLOCATABLE,
SAVE :: zufi(:,:), zvfi(:,:)
160 REAL,
ALLOCATABLE,
SAVE :: ztfi(:,:),zqfi(:,:,:)
162 REAL,
ALLOCATABLE,
SAVE :: pcvgu(:,:), pcvgv(:,:)
163 REAL,
ALLOCATABLE,
SAVE :: pcvgt(:,:), pcvgq(:,:,:)
165 REAL,
ALLOCATABLE,
SAVE :: zdufi(:,:),zdvfi(:,:)
166 REAL,
ALLOCATABLE,
SAVE :: zdtfi(:,:),zdqfi(:,:,:)
167 REAL,
ALLOCATABLE,
SAVE :: zdpsrf(:)
168 REAL,
SAVE,
ALLOCATABLE :: flxwfi(:,:)
171 REAL,
ALLOCATABLE,
SAVE :: zplev_omp(:,:)
172 REAL,
ALLOCATABLE,
SAVE :: zplay_omp(:,:)
173 REAL,
ALLOCATABLE,
SAVE :: zphi_omp(:,:)
174 REAL,
ALLOCATABLE,
SAVE :: zphis_omp(:)
175 REAL,
ALLOCATABLE,
SAVE :: presnivs_omp(:)
176 REAL,
ALLOCATABLE,
SAVE :: zufi_omp(:,:)
177 REAL,
ALLOCATABLE,
SAVE :: zvfi_omp(:,:)
178 REAL,
ALLOCATABLE,
SAVE :: ztfi_omp(:,:)
179 REAL,
ALLOCATABLE,
SAVE :: zqfi_omp(:,:,:)
180 REAL,
ALLOCATABLE,
SAVE :: zdufi_omp(:,:)
181 REAL,
ALLOCATABLE,
SAVE :: zdvfi_omp(:,:)
182 REAL,
ALLOCATABLE,
SAVE :: zdtfi_omp(:,:)
183 REAL,
ALLOCATABLE,
SAVE :: zdqfi_omp(:,:,:)
184 REAL,
ALLOCATABLE,
SAVE :: zdpsrf_omp(:)
185 REAL,
SAVE,
ALLOCATABLE :: flxwfi_omp(:,:)
200 REAL,
ALLOCATABLE,
SAVE :: zdufic_omp(:,:)
201 REAL,
ALLOCATABLE,
SAVE :: zdvfic_omp(:,:)
202 REAL,
ALLOCATABLE,
SAVE :: zdtfic_omp(:,:)
203 REAL,
ALLOCATABLE,
SAVE :: zdqfic_omp(:,:,:)
204 REAL jh_cur_split,zdt_split
205 LOGICAL debut_split,lafin_split
215 LOGICAL,
SAVE :: first_omp=.true.
219 REAL zsinbis(
iim),zcosbis(
iim),z1bis(
iim)
225 REAL rtetastd(ntetastd)
226 DATA rtetastd/350., 380., 405./
227 REAL pvteta(klon,ntetastd)
232 LOGICAL firstcal, debut
233 DATA firstcal/.true./
237 REAL,
SAVE,
dimension(1:iim,1:llm):: du_send,du_recv,dv_send,dv_recv
240 INTEGER,
dimension(MPI_STATUS_SIZE,4) :: status
242 INTEGER,
dimension(1,4) :: status
244 INTEGER,
dimension(4) :: req
245 REAL,
ALLOCATABLE,
SAVE:: zdufi2(:,:),zdvfi2(:,:)
246 integer ::
k,kstart,kend
264 IF (ngridmx.NE.2+(jjm-1)*
iim)
THEN
265 write(
lunout,*)
'STOP dans calfis'
267 &
'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim'
268 write(
lunout,*)
' ngridmx jjm iim '
273 ALLOCATE(zpsrf(klon))
274 ALLOCATE(zplev(klon,llm+1),zplay(klon,llm))
275 ALLOCATE(zphi(klon,llm),zphis(klon))
276 ALLOCATE(zufi(klon,llm), zvfi(klon,llm))
277 ALLOCATE(ztfi(klon,llm),zqfi(klon,llm,nqtot))
278 ALLOCATE(pcvgu(klon,llm), pcvgv(klon,llm))
279 ALLOCATE(pcvgt(klon,llm), pcvgq(klon,llm,2))
280 ALLOCATE(zdufi(klon,llm),zdvfi(klon,llm))
281 ALLOCATE(zdtfi(klon,llm),zdqfi(klon,llm,nqtot))
282 ALLOCATE(zdpsrf(klon))
283 ALLOCATE(zdufi2(klon+
iim,llm),zdvfi2(klon+
iim,llm))
284 ALLOCATE(flxwfi(klon,llm))
334 zplev( ig0,
l ) = pp(
i,
j,
l)
350 pksurcp = ppk(
i,
j,
l) /
cpp
351 zplay(ig0,
l) =
preff * pksurcp ** unskap
352 ztfi(ig0,
l) = pteta(
i,
j,
l) * pksurcp
371 zqfi(ig0,
l,iq) = pq(
i,
j,
l,iiq)
388 zphi(ig0,
l) = pphi(
i,
j,
l)
401 zphis(ig0) = pphis(
i,
j)
413 zphi(ig,
l)=zphi(ig,
l)-zphis(ig)
426 if (is_north_pole) kstart=2
427 if (is_south_pole) kend=klon-1
439 $ + pucov(1,
j,
l)/
cu(1,
j) )
441 zufi(ig0,
l)= 0.5*( pucov(
i-1,
j,
l)/
cu(
i-1,
j)
458 zvfi(ig0,
l)= 0.5 *( pvcov(
i,
j-1,
l)/
cv(
i,
j-1)
470 if (is_north_pole)
then
497 if (is_south_pole)
then
518 IF (is_sequential.and.(planet_type==
"earth"))
THEN
522 CALL
pvtheta(ngridmx,llm,pucov,pvcov,pteta,
524 $ ntetastd,rtetastd,pvteta)
537 flxwfi(ig0,
l) = flxw(
i,
j,
l)
553 allocate(zplev_omp(klon,llm+1))
554 allocate(zplay_omp(klon,llm))
555 allocate(zphi_omp(klon,llm))
556 allocate(zphis_omp(klon))
557 allocate(presnivs_omp(llm))
558 allocate(zufi_omp(klon,llm))
559 allocate(zvfi_omp(klon,llm))
560 allocate(ztfi_omp(klon,llm))
561 allocate(zqfi_omp(klon,llm,nqtot))
562 allocate(zdufi_omp(klon,llm))
563 allocate(zdvfi_omp(klon,llm))
564 allocate(zdtfi_omp(klon,llm))
565 allocate(zdqfi_omp(klon,llm,nqtot))
566 allocate(zdufic_omp(klon,llm))
567 allocate(zdvfic_omp(klon,llm))
568 allocate(zdtfic_omp(klon,llm))
569 allocate(zdqfic_omp(klon,llm,nqtot))
570 allocate(zdpsrf_omp(klon))
571 allocate(flxwfi_omp(klon,llm))
577 offset=klon_omp_begin-1
581 zplev_omp(
i,
l)=zplev(offset+
i,
l)
587 zplay_omp(
i,
l)=zplay(offset+
i,
l)
593 zphi_omp(
i,
l)=zphi(offset+
i,
l)
598 zphis_omp(
i)=zphis(offset+
i)
608 zufi_omp(
i,
l)=zufi(offset+
i,
l)
614 zvfi_omp(
i,
l)=zvfi(offset+
i,
l)
620 ztfi_omp(
i,
l)=ztfi(offset+
i,
l)
627 zqfi_omp(
i,
l,iq)=zqfi(offset+
i,
l,iq)
634 zdufi_omp(
i,
l)=zdufi(offset+
i,
l)
640 zdvfi_omp(
i,
l)=zdvfi(offset+
i,
l)
646 zdtfi_omp(
i,
l)=zdtfi(offset+
i,
l)
653 zdqfi_omp(
i,
l,iq)=zdqfi(offset+
i,
l,iq)
659 zdpsrf_omp(
i)=zdpsrf(offset+
i)
664 flxwfi_omp(
i,
l)=flxwfi(offset+
i,
l)
674 zdt_split=
dtphys/nsplit_phys
681 do isplit=1,nsplit_phys
683 jh_cur_split=jh_cur+(isplit-1) *
dtvr / (
daysec *nsplit_phys)
684 debut_split=debut.and.isplit==1
685 lafin_split=lafin.and.isplit==nsplit_phys
687 if (planet_type==
"earth")
then
718 else if ( planet_type==
"generic" )
then
747 zufi_omp(:,:)=zufi_omp(:,:)+zdufi_omp(:,:)*zdt_split
748 zvfi_omp(:,:)=zvfi_omp(:,:)+zdvfi_omp(:,:)*zdt_split
749 ztfi_omp(:,:)=ztfi_omp(:,:)+zdtfi_omp(:,:)*zdt_split
750 zqfi_omp(:,:,:)=zqfi_omp(:,:,:)+zdqfi_omp(:,:,:)*zdt_split
752 zdufic_omp(:,:)=zdufic_omp(:,:)+zdufi_omp(:,:)
753 zdvfic_omp(:,:)=zdvfic_omp(:,:)+zdvfi_omp(:,:)
754 zdtfic_omp(:,:)=zdtfic_omp(:,:)+zdtfi_omp(:,:)
755 zdqfic_omp(:,:,:)=zdqfic_omp(:,:,:)+zdqfi_omp(:,:,:)
763 zdufi_omp(:,:)=zdufic_omp(:,:)/nsplit_phys
764 zdvfi_omp(:,:)=zdvfic_omp(:,:)/nsplit_phys
765 zdtfi_omp(:,:)=zdtfic_omp(:,:)/nsplit_phys
766 zdqfi_omp(:,:,:)=zdqfic_omp(:,:,:)/nsplit_phys
772 zplev(offset+
i,
l)=zplev_omp(
i,
l)
778 zplay(offset+
i,
l)=zplay_omp(
i,
l)
784 zphi(offset+
i,
l)=zphi_omp(
i,
l)
790 zphis(offset+
i)=zphis_omp(
i)
800 zufi(offset+
i,
l)=zufi_omp(
i,
l)
806 zvfi(offset+
i,
l)=zvfi_omp(
i,
l)
812 ztfi(offset+
i,
l)=ztfi_omp(
i,
l)
819 zqfi(offset+
i,
l,iq)=zqfi_omp(
i,
l,iq)
826 zdufi(offset+
i,
l)=zdufi_omp(
i,
l)
832 zdvfi(offset+
i,
l)=zdvfi_omp(
i,
l)
838 zdtfi(offset+
i,
l)=zdtfi_omp(
i,
l)
845 zdqfi(offset+
i,
l,iq)=zdqfi_omp(
i,
l,iq)
851 zdpsrf(offset+
i)=zdpsrf_omp(
i)
878 call mpi_issend(du_send,
iim*llm,mpi_real8,mpi_rank-1,401,
879 & comm_lmdz,req(1),ierr)
880 call mpi_issend(dv_send,
iim*llm,mpi_real8,mpi_rank-1,402,
881 & comm_lmdz,req(2),ierr)
889 if (mpi_rank<mpi_size-1)
then
894 call mpi_irecv(du_recv,
iim*llm,mpi_real8,mpi_rank+1,401,
895 & comm_lmdz,req(3),ierr)
896 call mpi_irecv(dv_recv,
iim*llm,mpi_real8,mpi_rank+1,402,
897 & comm_lmdz,req(4),ierr)
909 if (mpi_rank>0 .and. mpi_rank< mpi_size-1)
then
910 call mpi_waitall(4,req(1),status,ierr)
911 else if (mpi_rank>0)
then
912 call mpi_waitall(2,req(1),status,ierr)
913 else if (mpi_rank <mpi_size-1)
then
914 call mpi_waitall(2,req(3),status,ierr)
928 zdufi2(1:klon,
l)=zdufi(1:klon,
l)
929 zdufi2(klon+1:klon+
iim,
l)=du_recv(1:
iim,
l)
931 zdvfi2(1:klon,
l)=zdvfi(1:klon,
l)
932 zdvfi2(klon+1:klon+
iim,
l)=dv_recv(1:
iim,
l)
934 pdhfi(:,jj_begin,
l)=0
935 pdqfi(:,jj_begin,
l,:)=0
936 pdufi(:,jj_begin,
l)=0
937 pdvfi(:,jj_begin,
l)=0
939 if (.not. is_south_pole)
then
940 pdhfi(:,jj_end:jj_end+1,
l)=0
941 pdqfi(:,jj_end:jj_end+1,
l,:)=0
942 pdufi(:,jj_end:jj_end+1,
l)=0
943 pdvfi(:,jj_end:jj_end+1,
l)=0
952 if (.not. is_south_pole)
then
953 pdpsfi(:,jj_end:jj_end+1)=0
968 if (is_north_pole) kstart=2
969 if (is_south_pole) kend=klon-1
977 pdpsfi(
i,
j) = zdpsrf(ig0)
978 if (
i==1) pdpsfi(iip1,
j) = zdpsrf(ig0)
981 if (is_north_pole)
then
983 pdpsfi(
i,1) = zdpsrf(1)
987 if (is_south_pole)
then
989 pdpsfi(
i,
jjp1) = zdpsrf(klon)
1002 if (is_north_pole) kstart=2
1003 if (is_south_pole) kend=klon-1
1014 pdhfi(
i,
j,
l) =
cpp * zdtfi(ig0,
l) / ppk(
i,
j,
l)
1015 if (
i==1) pdhfi(iip1,
j,
l) =
cpp * zdtfi(ig0,
l) / ppk(
i,
j,
l)
1018 if (is_north_pole)
then
1020 pdhfi(
i,1,
l) =
cpp * zdtfi(1,
l) / ppk(
i, 1 ,
l)
1024 if (is_south_pole)
then
1067 pdqfi(:,jj_begin:jj_end,
l,:)=0.
1083 pdqfi(
i,
j,
l,iiq) = zdqfi(ig0,
l,iq)
1084 if (
i==1) pdqfi(iip1,
j,
l,iiq) = zdqfi(ig0,
l,iq)
1087 IF (is_north_pole)
then
1089 pdqfi(
i,1,
l,iiq) = zdqfi(1,
l,iq)
1093 IF (is_south_pole)
then
1095 pdqfi(
i,
jjp1,
l,iiq) = zdqfi(klon,
l,iq)
1115 pdufi(
i,
j,
l)=0.5*(zdufi2(ig0,
l)+zdufi2(ig0+1,
l))*
cu(
i,
j)
1119 pdufi(
iim,
j,
l)=0.5*( zdufi2(ig0,
l)
1121 pdufi(iip1,
j,
l)=0.5*(zdufi2(ig0,
l)+zdufi2(ig0+1,
l))*
cu(
i,
j)
1126 if (is_north_pole)
then
1132 if (is_south_pole)
then
1147 if (is_north_pole) kstart=2
1148 if (is_south_pole) kend=klon-1-
iim
1158 pdvfi(
i,
j,
l)=0.5*(zdvfi2(ig0,
l)+zdvfi2(ig0+
iim,
l))*
cv(
i,
j)
1159 if (
i==1) pdvfi(iip1,
j,
l) = 0.5*(zdvfi2(ig0,
l)+
1160 $ zdvfi2(ig0+
iim,
l))
1172 if (is_north_pole)
then
1182 $ 0.5*(pdvfi(
i,1,
l)+zdvfi(
i+1,
l))*
cv(
i,1)
1185 pdvfi(iip1,1,
l) = pdvfi(1,1,
l)
1192 if (is_south_pole)
then
1198 pdvfi(
i,jjm,
l)=zdufi(klon,
l)*cos(
rlonv(
i))
1199 $ +zdvfi(klon,
l)*sin(
rlonv(
i))
1202 $ 0.5*(pdvfi(
i,jjm,
l)+zdvfi(klon-iip1+
i,
l))*
cv(
i,jjm)
1205 pdvfi(iip1,jjm,
l)= pdvfi(1,jjm,
l)
1219 &
"calfis_p: for now can only work with parallel physics"