copyright (C) 2001 MSC-RPN COMM %%%MC2%%% *subroutine mc2pds (lat,lon,latmin,dlat,rang,poids,theta,ni,nj) 1 implicit none * integer ni,nj,rang(*) real lat(ni,nj),lon(ni,nj),latmin,dlat real poids(*),theta(*) * #include "yomdyn1.cdk"
#include "grd.cdk"
#include "dynmem.cdk"
#include "maxdim.cdk"
#include "diagnml.cdk"
#include "topo.cdk"
#include "consdyn_8.cdk"
* logical rejected integer nstatcln,statcln(256),tt integer i,ii,j,ierr real ym,lo,maxhaut,minhaut * real sum,born1,born2 dimension sum(nbbande), born1(nbbande+1), born2(nbbande+1) * *-------------------------------------------------------------------- * nstatcln=0 do ii=1,250 statcln(ii)=0 end do * do i = 1,nbbande sum(i) = 0. enddo * if (divzon.lt.2) then do i = 1,nbbande born1(i) = latmin+(i-1)*dlat born2(i) = latmin+i*dlat sum(i) = 0.0 end do born2(nbbande)=born2(nbbande)+0.1 endif * if (divzon.eq.2) then * determination de la hauteur max et min pour la zone choisie. * determination de la largeur d'une bande. minhaut=40000.0 maxhaut=0.0 do i = iinf,isup do j = jinf,jsup minhaut=min(hh0(i,j,1), minhaut) maxhaut=max(hh0(i,j,1), maxhaut) end do end do dlat=(maxhaut-minhaut) / nbbande do i =1,nbbande born1(i)=minhaut+(i-1)*dlat born2(i)=minhaut+i*dlat end do born2(nbbande)=born2(nbbande)+0.1 * *dlat (km for mc2_series) dlat=dlat/1000.0 endif * if (divzon.eq.3) then do i =1,nbbande born1(i)= iinf born2(i)= isup end do endif * * Boucle de calcul ds poids et rang en chaque point de grille do 1310 j = 1, nj do 1310 i = 1, ni * calcul du poids en fonction du facteur d'echelle de la projection poids(i+(j-1)*ni) = grdx * grdy / sbxy(i,j) * * initialiser rang a zero (rb) if (divzon.eq.1) then rang(i+(j-1)*ni)=0 if (((i.ge.iinf).and.(i.le.isup)).and. $ ((j.ge.jinf).and.(j.le.jsup))) then do ii = 1,nbbande if ((lat(i,j).ge.born1(ii)) $ .and.(lat(i,j).lt.born2(ii))) then rang(i+(j-1)*ni)=ii endif end do endif endif if (divzon.eq.0) then rang(i+(j-1)*ni)=0 if (((i.ge.iinf).and.(i.le.isup)).and. $ ((j.ge.jinf).and.(j.le.jsup))) then do ii = 1,nbbande ym = j if ((ym.ge.born1(ii)).and.(ym.lt.born2(ii))) then rang(i+(j-1)*ni)=ii endif end do endif endif * * initialiser en fonction des hauteurs topographiques. if (divzon.eq.2) then rang(i+(j-1)*ni)=0 if (((i.ge.iinf).and.(i.le.isup)).and. + ((j.ge.jinf).and.(j.le.jsup))) then do ii = 1,nbbande if ((hh0(i,j,1).ge.born1(ii)).and. + (hh0(i,j,1).lt.born2(ii))) then rang(i+(j-1)*ni)=ii endif end do endif endif * * initialiser en fonction des positions de station. if (divzon.eq.3) then rang(i+(j-1)*ni)=0 do 39 ii = 1,nbbande !nbbande = nstat * si station repertorie comme rejete, passe a la porchaine rejected = .false. do tt=1,nstatcln if (statcln(tt).eq.ii) rejected = .true. end do if (.not.rejected) then * le point est-il dans la limite de la station if ((i.le.statijd(1,ii)+dimi) $ .and.(j.le.statijd(2,ii)+dimj) $ .and.(i.ge.statijd(1,ii)-dimi) $ .and.(j.ge.statijd(2,ii)-dimj)) then if (rang(i+(j-1)*ni).eq.0) then * si station hors limite, elimine la station if (((i.lt.iinf).and.(i.gt.isup)).and. $ ((j.lt.jinf).and.(j.gt.jsup))) then nstatcln=nstatcln+1 statcln(nstatcln)=ii print *,'station (i,j)= ',statijd(1,ii), $ statijd(2,ii), $ ' rejected in mc2pds (outlimit)' else rang(i+(j-1)*ni)=ii endif else * si point deja alouee (recoupement), * elimine la station nstatcln=nstatcln+1 statcln(nstatcln)=ii print *,'station (i,j)= ',statijd(1,ii), $ statijd(2,ii), $ ' rejected in mc2pds (supperposition)' endif !(rang(i+(j-1)*ni).eq.0) endif !(limite de la station) endif !(.not.rejected) 39 continue endif 1310 continue * * Verify each grid point regarding to rejected stations * do i=1,ni do j=1,nj do ii=1,nstatcln if (rang(i+(j-1)*ni).eq.ii) rang(i+(j-1)*ni)=0 enddo enddo enddo * * Normalise les poids do i=1,nbbande sum(i) =0. enddo do i = 1,ni*nj if (rang(i).gt.0) then sum(rang(i)) = sum(rang(i)) + poids(i) endif end do * do i = 1,ni*nj if (rang(i).gt.0) then if (sum(rang(i)).ne.0.0) poids(i)=poids(i)/sum(rang(i)) endif end do * do j = 1,nj do i = 1,ni lo = lon(i,j) if (lo.ge.180.) lo=lo-180. theta(i+(j-1)*ni) = (lo+Grd_dgrw-180.)*pi_8/180. enddo enddo * *-------------------------------------------------------------------- return end