Merge branch 'master' into devel
[wrffire.git] / standalone / moisture_test_main.F
blob59a5a39cb12bb3b4d08a36a52794ab33c5b7a73c
1 ! standalone moisture model test
2 ! inpout from file moisture_input.txt with each line of the form
4 ! Time  T P  Q RAIN
5 ! h     K Pa 1 mm/h
7 program moisture_main
8 use module_fr_sfire_phys, only: advance_moisture, init_fuel_cats, moisture_classes
9 use module_fr_sfire_util, only: fire_print_msg , crash
10 implicit none
12 character(len=128)::infile,outfile,prtfile
13 integer, parameter::nfmc=5 ! change if needed
15 integer, parameter:: ims=1,ime=1,jms=1,jme=1
16 integer::its=ims,ite=ime,jts=jms,jte=jme
17 real, dimension(ims:ime,1:nfmc,jms:jme)::fmc_gc,fmc_equi,fmc_lag
18 real, dimension(ims:ime,jms:jme)::t2,q2,psfc,t2_old,q2_old,psfc_old, &
19    rainc,rainnc,rain_old,rh_fire
20 logical::initialize
21 integer::fmoist_init=2   ! initialize at equilibrium
22 real::moisture_dt,dt
23 integer::istep,i,k,nsteps=999999
24 real::t,p,q,rain,hours,fmc(nfmc),hours_old
25 character(len=100)::fmt(8)
27 !*** executable
29 infile='moisture_input.txt'
30 outfile='moisture_output.txt'
31 prtfile='moisture_print.txt'
33 fire_print_msg = 2   ! change to 2 to get more debugging prints
35 call init_fuel_cats(.true.)
37 open(1,file=trim(infile),form='formatted',status='old',err=91)
38 open(7,file=trim(prtfile),form='formatted',status='unknown',err=93)
39 open(8,file=trim(outfile),form='formatted',status='unknown',err=92)
41 ! write header
42 if(moisture_classes>5)call crash('at most 5 moisture classes allowed')
43 do i=6,7
44     write(i,1)'Step','Time', 'T','P','Q','RAIN','RH',('EQUI',k,'TLAG',k,'FMC',k,k=1,moisture_classes)
45     write(i,2)' ','hours','K','Pa','kg/kg','mm','1',('kg/kg','hours','kg/kg',k=1,moisture_classes)
46 enddo
47 1 format(a4,a8,  a6,  a9,  a8  ,a8, a6, 5(a5,i1,a8,i1,a5,i1))
48 2 format(a4,a8,  a6,  a9,  a8  ,a8, a6, 5(a6,a9,a6))
49 fmt(6)='(i4,f8.2,f6.1,f9.1,f8.5,f8.1,f6.3,5(f6.3,f9.1,f6.3))'
50 fmt(7)=fmt(6)
51 fmt(8)='(i4,21e14.7)'
53 fire_print_msg = 0   ! change to 2 to get more debugging prints
55 do istep=1,999999
57     ! read data line
58     read(1,*,end=9,err=94)hours,t,p,q,rain
60     ! set the values in
62     if(istep.eq.1)then
63         moisture_dt=0.  ! required on initialization
64         initialize=.true.
65     else
66         moisture_dt=3600*(hours - hours_old)  !
67         initialize=.false.
68     endif
69     hours_old=hours
71     t2=t
72     q2=q
73     psfc=p
74     rainc=0.
75     rainnc=rain
77     call advance_moisture(    &
78         initialize,                 & ! initialize timestepping. true on the first call at time 0, then false
79         ims,ime,  jms,jme,          & ! memory dimensions
80         its,ite,  jts,jte,          & ! tile dimensions
81         nfmc,                       & ! dimension of moisture fields
82         moisture_dt,                & ! timestep = time step time elapsed from the last call
83         rainc, rainnc,              & ! accumulated rain
84         t2, q2, psfc,               & ! temperature (K), vapor contents (kg/kg), pressure (Pa) at the surface
85         rain_old,                   & ! previous value of accumulated rain
86         t2_old, q2_old, psfc_old,   & ! previous values of the atmospheric state at surface
87         rh_fire,                    & ! relative humidity
88         fmc_gc,                     & ! fuel moisture by class, updated
89         fmc_equi,                   & ! fuel moisture equilibrium by class, for diagnostics only
90         fmc_lag                    & ! fuel moisture timelag by class, for diagnostics only
91         )
93     ! print the output
94     do i=6,8
95         write(i,fmt(i))istep,hours,t,p,q,rain,rh_fire(its,jts),(fmc_equi(its,k,jts),fmc_lag(its,k,jts),fmc_gc(its,k,jts), &
96             k=1,moisture_classes)
97     enddo
99 enddo
101 write(6,*)'Maximum number of steps reached before reading whole input file ',trim(infile)
103 9 continue
104 write(6,*)'Completed ',istep-1,' steps'
105 write(6,*)'Input from flat text file ',trim(infile) 
106 write(6,*)'Output with headers is in ',trim(prtfile) 
107 write(6,*)'Output as a flat text is in ',trim(outfile) 
109 close(7)
110 close(8)
112 goto 999
114 91 print *,'Cannot open ',trim(infile)
115 goto 998
116 92 print *,'Cannot open ',trim(outfile)
117 goto 998
118 93 print *,'Cannot open ',trim(prtfile)
119 goto 998
120 94 print *,'Error reading record ',istep,' in file ',trim(infile)
122 998 continue
124 999 continue
126 end program moisture_main