Changeset 588 for trunk/LMDZ.GENERIC/libf/dyn3d
- Timestamp:
- Mar 19, 2012, 11:27:18 AM (13 years ago)
- Location:
- trunk/LMDZ.GENERIC/libf/dyn3d
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/libf/dyn3d/interp_horiz.F
r135 r588 19 19 c """"""""" 20 20 21 INTEGER imo, jmo ! dimensions ancienne grille (input)22 INTEGER imn,jmn ! dimensions nouvelle grille (input)21 INTEGER,INTENT(IN) :: imo, jmo ! dimensions ancienne grille (input) 22 INTEGER,INTENT(IN) :: imn,jmn ! dimensions nouvelle grille (input) 23 23 24 REAL rlonuo(imo+1) ! Latitude et25 REAL rlatvo(jmo) ! longitude des26 REAL rlonun(imn+1) ! bord des27 REAL rlatvn(jmn) ! cases "scalaires" (input)24 REAL,INTENT(IN) :: rlonuo(imo+1) ! Latitude et 25 REAL,INTENT(IN) :: rlatvo(jmo) ! longitude des 26 REAL,INTENT(IN) :: rlonun(imn+1) ! bord des 27 REAL,INTENT(IN) :: rlatvn(jmn) ! cases "scalaires" (input) 28 28 29 INTEGER lm ! dimension verticale (input)30 REAL varo (imo+1, jmo+1,lm) ! var dans l'ancienne grille (input)31 REAL varn (imn+1,jmn+1,lm) ! var dans la nouvelle grille (output)29 INTEGER,INTENT(IN) :: lm ! dimension verticale (input) 30 REAL,INTENT(IN) :: varo (imo+1, jmo+1,lm) ! var dans l'ancienne grille (input) 31 REAL,INTENT(OUT) :: varn (imn+1,jmn+1,lm) ! var dans la nouvelle grille (output) 32 32 33 33 c Autres variables … … 39 39 INTEGER ii,jj,l 40 40 41 REAL airen ((imnmx2+1)*(jmnmx2+1)) ! aire dans la nouvelle grille41 REAL,SAVE :: airen ((imnmx2+1)*(jmnmx2+1)) ! aire dans la nouvelle grille 42 42 REAL airentotn ! aire totale pole nord dans la nouvelle grille 43 43 REAL airentots ! aire totale pole sud dans la nouvelle grille … … 48 48 c + des pouiemes (cas ou une maille est a cheval sur 2 ou 4 mailles) 49 49 c Il y a un test dans iniinterp_h pour s'assurer que ktotal < kmax 50 INTEGER kmax, k, ktotal 50 INTEGER kmax, k 51 integer,save :: ktotal 51 52 parameter (kmax = 360*179 + 200000) 52 53 c parameter (kmax = 360*179 + 40000) 53 54 54 INTEGER iik(kmax), jjk(kmax),jk(kmax),ik(kmax)55 REAL intersec(kmax)56 REAL R55 INTEGER,SAVE :: iik(kmax), jjk(kmax),jk(kmax),ik(kmax) 56 REAL,SAVE :: intersec(kmax) 57 REAL r 57 58 REAL totn, tots 58 integer prev_sumdim 59 save prev_sumdim 60 data prev_sumdim /0/ 61 59 integer,save :: prev_sumdim=0 62 60 63 logical firsttest, aire_ok 64 save firsttest 65 data firsttest /.true./ 66 data aire_ok /.true./ 61 logical,save :: firsttest=.true. , aire_ok=.true. 67 62 68 integer imoS,jmoS,imnS,jmnS 69 save imoS,jmoS,imnS,jmnS 70 save ktotal,iik,jjk,jk,ik,intersec,airen 71 REAL pi 63 integer,save :: imoS,jmoS,imnS,jmnS 72 64 73 65 c Test dimensions imnmx2 jmnmx2 … … 115 107 end if 116 108 117 do l=1,lm 118 do jj =1 , jmn+1 119 do ii=1, imn+1 120 varn(ii,jj,l) =0. 121 end do 122 end do 123 end do 109 ! initialize varn() to zero 110 varn(1:imn+1,1:jmn+1,1:lm)=0. 124 111 125 112 c Interpolation horizontale … … 128 115 c de l'ancienne et la nouvelle grille 129 116 c 130 131 do k=1,ktotal 132 do l=1,lm 117 ! Ehouarn 2012: for some strange reason, with ifort v12.x, 118 ! when the order of the loop below is changed 119 ! values of varn(:,:,l=2...) are then sometimes remain zero! 120 do l=1,lm 121 do k=1,ktotal 133 122 varn(iik(k),jjk(k),l) = varn(iik(k),jjk(k),l) 134 123 & + varo(ik(k), jk(k),l)*intersec(k)/airen(iik(k) … … 161 150 end do 162 151 163 ENDDO 152 ENDDO ! of DO l=1, lm 164 153 165 154 … … 167 156 c TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST 168 157 if (firsttest) then 169 pi=2.*asin(1.)170 158 firsttest = .false. 171 159 write (*,*) 'INTERP. HORIZ. : TEST SUR LES AIRES:' … … 192 180 end do 193 181 if (aire_ok) write(*,*) 'INTERP. HORIZ. : AIRES OK' 194 endif 182 endif ! of if (firsttest) 195 183 196 184 c FIN TEST FIN TEST FIN TEST FIN TEST FIN TEST FIN TEST FIN TEST … … 198 186 199 187 200 return201 188 end -
trunk/LMDZ.GENERIC/libf/dyn3d/lect_start_archive.F
r253 r588 46 46 INTEGER imold,jmold,lmold,nsoilold,nqold 47 47 48 c et autres:49 c----------50 INTEGER lnblnk51 EXTERNAL lnblnk52 48 53 49 c Variables pour les lectures des fichiers "ini" … … 109 105 c REAL year_day,periheli,aphelie,peri_day 110 106 c REAL obliquit,z0,emin_turb,lmixmin 111 c REAL emissiv,emisice(2),albedice(2) ,tauvis107 c REAL emissiv,emisice(2),albedice(2) 112 108 c REAL iceradius(2) , dtemisice(2) 113 109 … … 994 990 co2icetotal = 0. 995 991 if (igcm_co2_ice.ne.0) then 996 DO j=1,jjp1 992 ! recast surface CO2 ice on new grid 993 call interp_horiz(qsurfold(1,1,igcm_co2_ice), 994 & qsurfs(1,1,igcm_co2_ice), 995 & imold,jmold,iim,jjm,1, 996 & rlonuold,rlatvold,rlonu,rlatv) 997 DO j=1,jjp1 997 998 DO i=1,iim 998 999 !co2icetotal = co2icetotal + co2iceS(i,j)*aire(i,j) 999 1000 co2icetotal=co2icetotal+qsurfS(i,j,igcm_co2_ice)*aire(i,j) 1000 1001 END DO 1001 END DO 1002 END DO 1003 else 1004 write(*,*) "Warning: No co2_ice surface tracer" 1002 1005 endif 1003 1006 … … 1009 1012 write(*,*)'Ancienne grille: masse de la glace CO2:',co2icetotalold 1010 1013 write(*,*)'Nouvelle grille: masse de la glace CO2:',co2icetotal 1014 if (co2icetotalold.ne.0.) then 1011 1015 write(*,*)'Ratio new ice./old ice =',co2icetotal/co2icetotalold 1016 endif 1012 1017 write(*,*) 1013 1018 -
trunk/LMDZ.GENERIC/libf/dyn3d/newstart.F
r535 r588 307 307 pa=tab_cntrl(17) ! reference pressure at which coord is purely pressure 308 308 !NB: in start_archive files tab_cntrl(17)=tab_cntrl(18)=0 309 if (preff.eq.0) then310 preff=610311 pa=20312 endif313 309 write(*,*) "Newstart: preff=",preff," pa=",pa 314 310 yes=' ' … … 1671 1667 cloudfrac(ig,l)=0.5 1672 1668 ENDDO 1669 ! Ehouarn, march 2012: also add some initialisation for hice 1670 hice(ig)=0.0 1673 1671 ENDDO 1674 1672 … … 1682 1680 ! ENDDO 1683 1681 1684 1685 1682 c======================================================================= 1686 1683 c Correct pressure on the new grid (menu 0) 1687 1684 c======================================================================= 1685 1688 1686 1689 1687 if ((choix_1.eq.0).and.(.not.flagps0)) then 1690 1688 r = 1000.*8.31/mugaz 1691 1689 1692 phi0=0.01693 1690 do j=1,jjp1 1694 1691 do i=1,iip1 1695 phi0 = phi0+phis(i,j)*aire(i,j) 1696 end do 1697 end do 1698 phi0=phi0/airetot 1699 1700 do j=1,jjp1 1701 do i=1,iip1 1702 ps(i,j) = ps(i,j) * 1703 ! . exp((phisold_newgrid(i,j)-phis(i,j)) / 1704 . exp((phi0-phis(i,j)) / 1692 ps(i,j) = ps(i,j) * 1693 . exp((phisold_newgrid(i,j)-phis(i,j)) / 1705 1694 . (t(i,j,1) * r)) 1706 1695 end do 1707 1696 end do 1708 1709 ! we must renormalise pressures AGAIN, because exp(-phi) is nonlinear 1710 ptot=0.0 1697 1698 c periodicite de ps en longitude 1711 1699 do j=1,jjp1 1712 do i=1,iip1 1713 ptot=ptot+ps(i,j)*aire(i,j) 1714 enddo 1715 enddo 1716 do j=1,jjp1 1717 do i=1,iip1 1718 ps(i,j)=ps(i,j)*ptotn/ptot 1719 enddo 1720 enddo 1721 1722 ! periodicity of surface ps in longitude 1723 do j=1,jjp1 1724 ps(1,j) = ps(iip1,j) 1700 ps(1,j) = ps(iip1,j) 1725 1701 end do 1726 1727 1702 end if 1728 1703 1704 1729 1705 c======================================================================= 1730 1706 c======================================================================= … … 1733 1709 c Initialisation de la physique / ecriture de newstartfi : 1734 1710 c======================================================================= 1711 1735 1712 1736 1713 CALL inifilr … … 1764 1741 endif 1765 1742 1766 1767 1743 C Calcul intermediaire 1768 1744 c … … 1798 1774 CALL caldyn0( itau,ucov,vcov,teta,ps,masse,pk,phis , 1799 1775 * phi,w, pbaru,pbarv,day_ini+time ) 1800 c CALL caldyn 1801 c $ ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis , 1802 c $ phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, day_ini ) 1803 1776 1777 1804 1778 CALL dynredem0("restart.nc",day_ini,anneeref,phis,nqmx) 1805 1779 CALL dynredem1("restart.nc",0.0,vcov,ucov,teta,q,nqmx,masse,ps)
Note: See TracChangeset
for help on using the changeset viewer.