00001
00002
00003
00004 #include "cppdefs.h"
00005 #if defined DIAGNOSTICS_BIO && defined AVERAGES
00006
00007
00008 subroutine wrt_bio_diags_avg
00009
00010 implicit none
00011 integer ierr, record, lstr, lvar, lenstr
00012 & , start(2), count(2), ibuff(4), nf_fwrite
00013 #if defined MPI & !defined PARALLEL_FILES
00014 include 'mpif.h'
00015 integer status(MPI_STATUS_SIZE), blank
00016 #endif
00017 #include "param.h"
00018 #include "scalars.h"
00019 #include "ncscrum.h"
00020 #include "forces.h"
00021 #include "grid.h"
00022 #include "ocean2d.h"
00023 #include "ocean3d.h"
00024 #include "mixing.h"
00025 #include "diagnostics.h"
00026
00027 #ifdef SOLVE3D
00028 integer iflux
00029 # include "work.h"
00030 #endif
00031
00032 #include "netcdf.inc"
00033
00034 #if defined MPI & !defined PARALLEL_FILES
00035 if (mynode.gt.0) then
00036 call MPI_Recv (blank, 1, MPI_INTEGER, mynode-1,
00037 & 1, MPI_COMM_WORLD, status, ierr)
00038 endif
00039 #endif
00040
00041
00042
00043
00044 call def_bio_diags_avg (nciddiabio_avg, nrecdiabio_avg, ierr)
00045 if (ierr .ne. nf_noerr) goto 99
00046 lstr=lenstr(dianamebio_avg)
00047
00048
00049
00050
00051 nrecdiabio_avg=max(nrecdiabio_avg,1)
00052 if (nrpfdiabio_avg.eq.0) then
00053 record=nrecdiabio_avg
00054 else
00055 record=1+mod(nrecdiabio_avg-1, nrpfdiabio_avg)
00056 endif
00057
00058
00059
00060
00061
00062
00063 ibuff(1)=iic
00064 ibuff(2)=nrecrst
00065 ibuff(3)=nrechis
00066
00067
00068
00069
00070
00071 ibuff(4)=nrecdiabio_avg
00072 start(1)=1
00073 start(2)=record
00074 count(1)=4
00075 count(2)=1
00076 ierr=nf_put_vara_int (nciddiabio_avg, diaTstepbio_avg,
00077 & start, count, ibuff)
00078 if (ierr .ne. nf_noerr) then
00079 write(stdout,1) 'time_step_avg', record, ierr
00080 & MYID
00081 goto 99
00082 endif
00083
00084
00085
00086 C write(*,*) 'Write Time'
00087 ierr=nf_put_var1_FTYPE (nciddiabio_avg, diaTimebio_avg, record,
00088 & Timediabio_avg)
00089 if (ierr .ne. nf_noerr) then
00090 lvar=lenstr(vname(1,indxTime))
00091 write(stdout,1) vname(1,indxTime)(1:lvar), record, ierr
00092 & MYID
00093 goto 99
00094 endif
00095
00096
00097
00098
00099
00100 #ifdef PISCES
00101
00102 # if defined key_trc_dia3d
00103 do iflux=1,NumFluxTerms
00104 ierr=nf_fwrite(bioFlux_avg(START_2D_ARRAY,1,iflux),
00105 & nciddiabio_avg, diabioFlux_avg(iflux), record, r3dvar)
00106 if (ierr .ne. nf_noerr) then
00107 lvar=lenstr(vname(1,indxbioFlux+iflux-1))
00108 write(stdout,1) vname(1,indxbioFlux+iflux-1)(1:lvar),
00109 & record, ierr MYID
00110 goto 99
00111 end if
00112 end do
00113
00114 # endif
00115
00116 # if defined key_trc_diaadd
00117 do iflux=1,NumVSinkTerms
00118 c$$$ if (iflux.eq.11) write(*,*) 'ZMEU WRT_AVG',
00119 c$$$ & bioVSink_avg(30,30,iflux)
00120 ierr=nf_fwrite(bioVSink_avg(START_2D_ARRAY,iflux),
00121 & nciddiabio_avg, diabioVsink_avg(iflux), record, r2dvar)
00122 if (ierr .ne. nf_noerr) then
00123 lvar=lenstr(vname(1,indxbioVSink+iflux-1))
00124 write(stdout,1) vname(1,indxbioVSink+iflux-1)(1:lvar),
00125 & record, ierr MYID
00126 goto 99
00127 end if
00128 end do
00129
00130 # endif
00131
00132 #else
00133
00134
00135 do iflux=1,NumFluxTerms
00136 ierr=nf_fwrite(bioFlux_avg(START_2D_ARRAY,1,iflux),
00137 & nciddiabio_avg, diabioFlux_avg(iflux), record, r3dvar)
00138 if (ierr .ne. nf_noerr) then
00139 lvar=lenstr(vname(1,indxbioFlux+iflux-1))
00140 write(stdout,1) vname(1,indxbioFlux+iflux-1)(1:lvar),
00141 & record, ierr, MYID
00142 goto 99
00143 end if
00144 end do
00145
00146 do iflux=1,NumVSinkTerms
00147 ierr=nf_fwrite(bioVSink_avg(START_2D_ARRAY,0,iflux),
00148 & nciddiabio_avg, diabioVSink_avg(iflux), record, w3dvar)
00149 if (ierr .ne. nf_noerr) then
00150 lvar=lenstr(vname(1,indxbioVSink+iflux-1))
00151 write(stdout,1) vname(1,indxbioVSink+iflux-1)(1:lvar),
00152 & record, ierr, MYID
00153 goto 99
00154 end if
00155 end do
00156 # ifdef OXYGEN
00157
00158 do iflux = 1, NumGasExcTerms
00159 ierr = nf_fwrite(GasExcFlux_avg(START_2D_ARRAY,iflux),
00160 & ncid_bgc_flux_avg, avgGasExcFlux(iflux),
00161 & record, r2dvar)
00162 if (ierr .ne. nf_noerr) then
00163 lvar=lenstr(vname(1,indxGasExcFlux+iflux-1))
00164 write(stdout,1) vname(1,indxGasExcFlux+iflux-1)(1:lvar),
00165 & record, ierr, MYID
00166 goto 99
00167 end if
00168 end do
00169 # endif /* OXYGEN */
00170
00171 #endif
00172 1 format(/1x,'WRT_BIO_DIAG_AVG ERROR while writing variable ''', A,
00173 & ''' into diag_avg file.', /11x, 'Time record:',
00174 & I6,3x,'netCDF error code',i4,3x,a,i4)
00175 goto 100
00176 99 may_day_flag=3
00177 100 continue
00178
00179
00180
00181
00182
00183
00184 #if defined MPI & !defined PARALLEL_FILES
00185 ierr=nf_close (nciddiabio_avg)
00186 if (nrpfdiabio_avg.gt.0 .and. record.ge.nrpfdiabio_avg)
00187 & nciddiabio_avg=-1
00188 #else
00189 if (nrpfdiabio_avg.gt.0 .and. record.ge.nrpfdiabio_avg) then
00190 ierr=nf_close (nciddiabio_avg)
00191 nciddiabio_avg=-1
00192 else
00193 ierr=nf_sync(nciddiabio_avg)
00194 endif
00195 #endif
00196
00197
00198 if (ierr .eq. nf_noerr) then
00199 write(stdout,'(6x,A,2(A,I4,1x),A,I3)')
00200 & 'WRT_BIO_DIAG_AVG -- wrote ',
00201 & 'diag_avg fields into time record =', record, '/',
00202 & nrecdiabio_avg MYID
00203 else
00204 write(stdout,'(/1x,2A/)') 'WRT_BIO_DIAG_AVG ERROR: Cannot ',
00205 & 'synchronize/close diag_avg netCDF file.'
00206 may_day_flag=3
00207 endif
00208
00209 #if defined MPI & !defined PARALLEL_FILES
00210 if (mynode .lt. NNODES-1) then
00211 call MPI_Send (blank, 1, MPI_INTEGER, mynode+1,
00212 & 1, MPI_COMM_WORLD, ierr)
00213 endif
00214 #endif
00215 return
00216 end
00217
00218 #else
00219 subroutine wrt_bio_diag_avg_empty
00220 end
00221 #endif /* DIAGNOSTICS_BIO && AVERAGES*/