!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%% *** S/P FISIMP3SUBROUTINE FISIMP3 (D, DSIZ, F, FSIZ, V, VSIZ, 1 $ SE, KDIF, NI, NK, ZUSZNK, $ KOUNT) #include "impnone.cdk"
* INTEGER DSIZ, FSIZ,VSIZ,NI,NK,KOUNT REAL D(DSIZ), F(FSIZ),V(VSIZ),SE(NI,NK) REAL KDIF(NI,NK),ZUSZNK(NI) * *Author * C. Beaudoin (April 1988) * *Revision * 001 B. Bilodeau (Fall 1993) - New physics interface. * Change name from PHYSIMP (SEF model) to FISIMP. * 002 R. Sarrazin (Spring 1995) - ZU changed to 10 metres * 003 M. Desgagne (Oct 1995) - New interface. * 004 B. Bilodeau (Nov 96) - Replace common block pntclp by * common block turbus * 005 C. Girard (Fall 96) - New formulation. * 006 J. Mailhot (Oct 1998) - New SURFACE interface and explicit * formulation for the fluxes FC and FV * 007 B. Bilodeau (Nov 98) - Merge phyexe and param4. * Change name to fisimp3. * 008 B. Bilodeau (Nov 2000) - New comdeck phybus.cdk * *Object * To calculate the (unnormalized) diffusion coefficients KM and KT * and the (unnormalized) boundary conditions for the diffusion of * wind, temperature, and moisture * using simplified physical parameterizations. * The normalizations are done in S/P DIFVER5. *Arguments * * - Input/Output - * F field of permanent physics variables * V volatile bus * MF dimension of F * VSIZ dimension of V * * - Input - * SE staggered sigma levels * KDIF work field * NI horizontal dimension * NK vertical dimension * * - Output - * ZUSZNK ratio UV(NK) / UV(NK-1) * * - Input - * KOUNT timestep number * *Notes * Simplified physics includes full boundary layer where : * - countergradient term is neglected * - Prandtl number is 1./.74 * - KM = constant and KT = KM/.74 * - CM**2=drag coefficient = (.35/LN(1+ZA/Z0))**2 * - neglect the dependency of CM and CT on RI (Richardson number) * - Limit of Z(anemometer)=10*(roughness length) : ZA MAX.=10*Z0 * ** EXTERNAL SATQ INTEGER K,I REAL ZU,VMAG,CMSQ,QQS,ZNK,LNZNK,LNZU,SZERO,SBOT, $ DIFBAK,DIFBOT,DELTAS,XVAR,FILT DATA SZERO,SBOT,DIFBAK,DIFBOT/0.87,1.0,0.1,10.0/ DATA ZU/10.0/ * REAL UU, VV REAL RHO * #include "indx_sfc.cdk"
#include "phy_macros_f.h"
#include "phybus.cdk"
#include "options.cdk"
#include "consphy.cdk"
#include "dintern.cdk"
* integer ik * fonction-formule pour l'adressage ik(i,k) = (k-1)*ni + i -1 * #include "fintern.cdk"
* *--------------------------------------------------------------------- * * * KDIF VARIE CUBIQUEMENT ENTRE SBOT ET SZERO * EN SUPPOSANT QUE KDIF=KBOT A SBOT ET KDIF=KBAK A SZERO * ET QUE LA PENTE DE KDIF EST NULLE A SBOT ET SZERO. * ON SUPOOSE KDIF=KBAK EN HAUT DE SZERO. * DELTAS=SBOT-SZERO * *VDIR NODEP DO I=1,NI * V(BM +I-1)=0.0 V(BT +I-1)=0.0 V(ALFAT+I-1)=0.0 V(ALFAQ+I-1)=0.0 * F(TSURF+I-1)=F(TWATER+I-1) if(satuco) then F(QSURF+(indx_agrege-1)*NI+I-1) = $ foqst(F(TSURF+I-1),D(PMOINS+I-1)) else F(QSURF+(indx_agrege-1)*NI+I-1) = $ foqsa(F(TSURF+I-1),D(PMOINS+I-1)) endif * F(ILMO+I-1)=1./.74 * ENDDO * *VDIR NODEP DO I=1,NI*NK V(GTE+I-1)=0.0 V(GQ+I-1)=0.0 V(KM+I-1)=0.0 V(KT+I-1)=0.0 ENDDO * DO 1 K=1,NK *VDIR NODEP do 1 i=1,ni KDIF(I,K)=DIFBAK IF( (SE(I,K) .GE. SZERO) .AND. (SE(I,K) .LT. SBOT ))THEN XVAR=(SE(I,K)-SZERO)/DELTAS FILT=(3.-2.*XVAR)*XVAR*XVAR KDIF(I,K)=DIFBOT*FILT + (1. - FILT)*DIFBAK ENDIF IF(SE(I,K) .GE. SBOT) THEN KDIF(I,K)=DIFBOT ENDIF 1 CONTINUE * IF(DMOM) THEN DO 10 K=1,NK-1 *VDIR NODEP DO 11 I=1,NI V(KM+(K-1)*NI+I-1)=KDIF(I,K) V(KT+(K-1)*NI+I-1)=V(KM+(K-1)*NI+I-1)*F(ILMO+I-1) 11 CONTINUE 10 CONTINUE * IF(DRAG) THEN *VDIR NODEP DO 20 I=1,NI * * ZNK EST LA HAUTEUR DU NIVEAU D'ANEMOMETRE ZNK = -(RGASD/GRAV)*ALOG(D(SIGM+ik(I,NK)))*D(TMOINS+ik(I,NK)) * LNZNK EST LN(1 + ZNK/ZZ0) LNZNK = ALOG (ZNK + F(Z0+I-1)) - ALOG(F(Z0+I-1)) * * BETA : TERME HOMOGENE DE CONDITION AUX LIMITES A LA SURFACE * CMSQ = (karman/LNZNK)**2 UU = D(UMOINS+ik(i,nk)) VV = D(VMOINS+ik(i,nk)) VMAG = SQRT(UU*UU+VV*VV) V(BM+I-1) = CMSQ*VMAG V(BT+I-1) = CMSQ*VMAG*F(ILMO+I-1)*(1.-NINT(F(MG+I-1))) * * PROFIL LOGARITHMIQUE DU VENT IMPOSE POUR NIVEAU DIAGNOSTIQUE * * LNZU EST LN(1 + ZU/ZZ0) LNZU = ALOG (ZU + F(Z0+I-1)) - ALOG(F(Z0+I-1)) * ZUSZNK EST LE RAPPORT ENTRE LE MODULE DU VENT AUX * NIVEAUX NK+1 ET NK RESPECTIVEMENT ZUSZNK(I) = LNZU/LNZNK * 20 CONTINUE * * INCORPORATION DU GRADIENT D'EQUILIBRE (-grav/cpd) * POUR LA DIFFUSION DE LA TEMPERATURE * DO K=1,NK-1 *VDIR NODEP DO I=1,NI V(GTE+(K-1)*NI+I-1) = (-GRAV/CPD) ENDDO ENDDO * IF(CHAUF) THEN *VDIR NODEP DO 30 I=1,NI * ZNK EST LA HAUTEUR DU NIVEAU D'ANEMOMETRE ZNK = -(RGASD/GRAV)*ALOG(D(SIGM+ik(I,NK)))* $ D(TMOINS+ik(I,NK)) V(ALFAT+I-1)= -V(BT+I-1)*(F(TSURF+I-1) - $ V(THETAA+I-1)) RHO = D(PMOINS+I-1) / $ (RGASD*F(TSURF+I-1)*(1.+DELTA*F(QSURF+I-1))) V(FC+(indx_water -1)*ni+I-1) = -CPD * RHO * V(ALFAT+I-1) V(FC+(indx_agrege-1)*ni+I-1) = -CPD * RHO * V(ALFAT+I-1) 30 CONTINUE ENDIF * IF(EVAP) THEN *VDIR NODEP DO 40 I=1,NI V(ALFAQ+I-1) = -V(BT+I-1)* $ (F(QSURF+(indx_agrege-1)*ni+I-1) - $ D(HUMOINS+ik(I,NK))) RHO = D(PMOINS+I-1) / $ (RGASD*F(TSURF+I-1)*(1.+DELTA*F(QSURF+I-1))) V(FV+(indx_water -1)*ni+I-1) = -CHLC * RHO * V(ALFAQ+I-1) V(FV+(indx_agrege-1)*ni+I-1) = -CHLC * RHO * V(ALFAQ+I-1) 40 CONTINUE ENDIF * *VDIR NODEP DO I=1,NI V(BT+I-1) = 0.0 END DO * ENDIF * ENDIF * * CALCULER LES VALEURS AU NIVEAU DIAGNOSTIQUE IF(DMOM) THEN * *VDIR NODEP DO I=1,NI * IF(.NOT.DRAG) ZUSZNK(I) = 1. f(udiag+i-1) = D(UMOINS+ik(I,NK)) * ZUSZNK(I) f(vdiag+i-1) = D(VMOINS+ik(I,NK)) * ZUSZNK(I) * * TT(DIAGNOSTIQUE) = TT(AVANT-DERNIER NIVEAU) f(tdiag+i-1) = D(TMOINS +ik(I,NK)) * f(qdiag+i-1) = D(HUMOINS+ik(I,NK)) * END DO * ENDIF * RETURN END