This subroutine calculates and writes the total model energy, the energy and mass of each layer, and other globally integrated physical quantities.
306 type(verticalgrid_type),
intent(in) :: gv
308 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(in) :: u
309 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(in) :: v
311 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
313 type(thermo_var_ptrs),
intent(in) :: tv
315 type(time_type),
intent(inout) :: day
316 integer,
intent(in) :: n
318 type(sum_output_cs),
pointer :: cs
321 type(tracer_flow_control_cs),
optional,
pointer :: tracer_csp
341 real :: eta(szi_(g),szj_(g),szk_(g)+1)
342 real :: areatm(szi_(g),szj_(g))
344 real :: pe(szk_(g)+1)
347 real :: h_0ape(szk_(g)+1)
354 real :: vol_lay(szk_(g))
356 real :: mass_lay(szk_(g))
373 real :: salin_mass_in
393 salt_efp, heat_efp, salt_chg_efp, heat_chg_efp, mass_chg_efp, &
394 mass_anom_efp, salt_anom_efp, heat_anom_efp
399 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
401 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1) :: &
403 real,
dimension(SZI_(G),SZJ_(G)) :: &
405 real :: h_to_m, h_to_kg_m2
406 integer :: num_nc_fields
408 integer :: i, j, k, is, ie, js, je, nz, m, isq, ieq, jsq, jeq
409 integer :: l, lbelow, labove
412 integer :: start_of_day, num_days
414 character(len=240) :: energypath_nc
415 character(len=200) :: mesg
416 character(len=32) :: mesg_intro, time_units, day_str, n_str, date_str
417 logical :: date_stamped
418 real :: tr_stocks(max_fields_)
419 real :: tr_min(max_fields_),tr_max(max_fields_)
420 real :: tr_min_x(max_fields_), tr_min_y(max_fields_), tr_min_z(max_fields_)
421 real :: tr_max_x(max_fields_), tr_max_y(max_fields_), tr_max_z(max_fields_)
422 logical :: tr_minmax_got(max_fields_) = .false.
423 character(len=40),
dimension(MAX_FIELDS_) :: &
425 integer :: ntr_stocks
426 real,
allocatable :: toten_pe(:)
428 integer :: iyear, imonth, iday, ihour, iminute, isecond, itick
431 type(vardesc) :: vars(num_fields+max_fields_)
434 if (.not.cs%use_temperature) num_nc_fields = 11
435 vars(1) = var_desc(
"Ntrunc",
"Nondim",
"Number of Velocity Truncations",
'1',
'1')
436 vars(2) = var_desc(
"En",
"Joules",
"Total Energy",
'1',
'1')
437 vars(3) = var_desc(
"APE",
"Joules",
"Total Interface APE",
'1',
'i')
438 vars(4) = var_desc(
"KE",
"Joules",
"Total Layer KE",
'1',
'L')
439 vars(5) = var_desc(
"H0",
"meter",
"Zero APE Depth of Interface",
'1',
'i')
440 vars(6) = var_desc(
"Mass_lay",
"kg",
"Total Layer Mass",
'1',
'L')
441 vars(7) = var_desc(
"Mass",
"kg",
"Total Mass",
'1',
'1')
442 vars(8) = var_desc(
"Mass_chg",
"kg",
"Total Mass Change between Entries",
'1',
'1')
443 vars(9) = var_desc(
"Mass_anom",
"kg",
"Anomalous Total Mass Change",
'1',
'1')
444 vars(10) = var_desc(
"max_CFL_trans",
"Nondim",
"Maximum finite-volume CFL",
'1',
'1')
445 vars(11) = var_desc(
"max_CFL_lin",
"Nondim",
"Maximum finite-difference CFL",
'1',
'1')
446 if (cs%use_temperature)
then 447 vars(12) = var_desc(
"Salt",
"kg",
"Total Salt",
'1',
'1')
448 vars(13) = var_desc(
"Salt_chg",
"kg",
"Total Salt Change between Entries",
'1',
'1')
449 vars(14) = var_desc(
"Salt_anom",
"kg",
"Anomalous Total Salt Change",
'1',
'1')
450 vars(15) = var_desc(
"Heat",
"Joules",
"Total Heat",
'1',
'1')
451 vars(16) = var_desc(
"Heat_chg",
"Joules",
"Total Heat Change between Entries",
'1',
'1')
452 vars(17) = var_desc(
"Heat_anom",
"Joules",
"Anomalous Total Heat Change",
'1',
'1')
455 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
456 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
457 h_to_m = gv%H_to_m ; h_to_kg_m2 = gv%H_to_kg_m2
459 if (.not.
associated(cs))
call mom_error(fatal, &
460 "write_energy: Module must be initialized before it is used.")
462 do j=js,je ;
do i=is,ie
463 areatm(i,j) = g%mask2dT(i,j)*g%areaT(i,j)
466 if (gv%Boussinesq)
then 468 do k=1,nz ;
do j=js,je ;
do i=is,ie
469 tmp1(i,j,k) = h(i,j,k) * (h_to_kg_m2*areatm(i,j))
470 enddo ;
enddo ;
enddo 471 mass_tot = reproducing_sum(tmp1, sums=mass_lay, efp_sum=mass_efp)
472 do k=1,nz ; vol_lay(k) = (h_to_m/h_to_kg_m2)*mass_lay(k) ;
enddo 475 if (cs%do_APE_calc)
then 476 do k=1,nz ;
do j=js,je ;
do i=is,ie
477 tmp1(i,j,k) = h_to_kg_m2 * h(i,j,k) * areatm(i,j)
478 enddo ;
enddo ;
enddo 479 mass_tot = reproducing_sum(tmp1, sums=mass_lay, efp_sum=mass_efp)
481 call find_eta(h, tv, gv%g_Earth, g, gv, eta)
482 do k=1,nz ;
do j=js,je ;
do i=is,ie
483 tmp1(i,j,k) = (eta(i,j,k)-eta(i,j,k+1)) * areatm(i,j)
484 enddo ;
enddo ;
enddo 485 vol_tot = h_to_m*reproducing_sum(tmp1, sums=vol_lay)
487 do k=1,nz ;
do j=js,je ;
do i=is,ie
488 tmp1(i,j,k) = h_to_kg_m2 * h(i,j,k) * areatm(i,j)
489 enddo ;
enddo ;
enddo 490 mass_tot = reproducing_sum(tmp1, sums=mass_lay, efp_sum=mass_efp)
491 do k=1,nz ; vol_lay(k) = mass_lay(k) / gv%Rho0 ;
enddo 496 if (
present(tracer_csp))
then 497 call call_tracer_stocks(h, tr_stocks, g, gv, tracer_csp, stock_names=tr_names, &
498 stock_units=tr_units, num_stocks=ntr_stocks,&
499 got_min_max=tr_minmax_got, global_min=tr_min, global_max=tr_max, &
500 xgmin=tr_min_x, ygmin=tr_min_y, zgmin=tr_min_z,&
501 xgmax=tr_max_x, ygmax=tr_max_y, zgmax=tr_max_z)
502 if (ntr_stocks > 0)
then 504 vars(num_nc_fields+m) = var_desc(tr_names(m), units=tr_units(m), &
505 longname=tr_names(m), hor_grid=
'1', z_grid=
'1')
507 num_nc_fields = num_nc_fields + ntr_stocks
511 if (cs%previous_calls == 0)
then 512 cs%mass_prev = mass_tot ; cs%fresh_water_input = 0.0
514 cs%mass_prev_EFP = mass_efp
515 cs%fresh_water_in_EFP = real_to_efp(0.0)
518 if (is_root_pe())
then 519 if (day > cs%Start_time)
then 520 call open_file(cs%fileenergy_ascii, trim(cs%energyfile), &
521 action=append_file, form=ascii_file, nohdrs=.true.)
523 call open_file(cs%fileenergy_ascii, trim(cs%energyfile), &
524 action=writeonly_file, form=ascii_file, nohdrs=.true.)
525 if (abs(cs%timeunit - 86400.0) < 1.0)
then 526 if (cs%use_temperature)
then 527 write(cs%fileenergy_ascii,
'(" Step,",7x,"Day, Truncs, & 528 &Energy/Mass, Maximum CFL, Mean Sea Level, Total Mass, Mean Salin, & 529 &Mean Temp, Frac Mass Err, Salin Err, Temp Err")')
530 write(cs%fileenergy_ascii,
'(12x,"[days]",17x,"[m2 s-2]",11x,"[Nondim]",7x,"[m]",13x,& 531 &"[kg]",9x,"[PSU]",6x,"[degC]",7x,"[Nondim]",8x,"[PSU]",8x,"[degC]")')
533 write(cs%fileenergy_ascii,
'(" Step,",7x,"Day, Truncs, & 534 &Energy/Mass, Maximum CFL, Mean sea level, Total Mass, Frac Mass Err")')
535 write(cs%fileenergy_ascii,
'(12x,"[days]",17x,"[m2 s-2]",11x,"[Nondim]",8x,"[m]",13x,& 536 &"[kg]",11x,"[Nondim]")')
539 if ((cs%timeunit >= 0.99) .and. (cs%timeunit < 1.01))
then 540 time_units =
" [seconds] " 541 else if ((cs%timeunit >= 3599.0) .and. (cs%timeunit < 3601.0))
then 542 time_units =
" [hours] " 543 else if ((cs%timeunit >= 86399.0) .and. (cs%timeunit < 86401.0))
then 544 time_units =
" [days] " 545 else if ((cs%timeunit >= 3.0e7) .and. (cs%timeunit < 3.2e7))
then 546 time_units =
" [years] " 548 write(time_units,
'(9x,"[",es8.2," s] ")') cs%timeunit
551 if (cs%use_temperature)
then 552 write(cs%fileenergy_ascii,
'(" Step,",7x,"Time, Truncs, & 553 &Energy/Mass, Maximum CFL, Mean Sea Level, Total Mass, Mean Salin, & 554 &Mean Temp, Frac Mass Err, Salin Err, Temp Err")')
555 write(cs%fileenergy_ascii,
'(A25,10x,"[m2 s-2]",11x,"[Nondim]",7x,"[m]",13x,& 556 &"[kg]",9x,"[PSU]",6x,"[degC]",7x,"[Nondim]",8x,"[PSU]",6x,& 557 &"[degC]")') time_units
559 write(cs%fileenergy_ascii,
'(" Step,",7x,"Time, Truncs, & 560 &Energy/Mass, Maximum CFL, Mean sea level, Total Mass, Frac Mass Err")')
561 write(cs%fileenergy_ascii,
'(A25,10x,"[m2 s-2]",11x,"[Nondim]",8x,"[m]",13x,& 562 &"[kg]",11x,"[Nondim]")') time_units
568 energypath_nc = trim(cs%energyfile) //
".nc" 569 if (day > cs%Start_time)
then 570 call reopen_file(cs%fileenergy_nc, trim(energypath_nc), vars, &
571 num_nc_fields, cs%fields, single_file, cs%timeunit, &
574 call create_file(cs%fileenergy_nc, trim(energypath_nc), vars, &
575 num_nc_fields, cs%fields, single_file, cs%timeunit, &
580 if (cs%do_APE_calc)
then 581 lbelow = 1 ; volbelow = 0.0
583 volbelow = volbelow + vol_lay(k)
584 if ((volbelow >= cs%DL(cs%lH(k))%vol_below) .and. &
585 (volbelow < cs%DL(cs%lH(k)+1)%vol_below))
then 588 labove=cs%list_size+1
589 l = (labove + lbelow) / 2
590 do while (l > lbelow)
591 if (volbelow < cs%DL(l)%vol_below)
then ; labove = l
592 else ; lbelow = l ;
endif 593 l = (labove + lbelow) / 2
598 h_0ape(k) = cs%DL(l)%depth - (volbelow - cs%DL(l)%vol_below) / cs%DL(l)%area
600 h_0ape(nz+1) = cs%DL(2)%depth
602 do k=1,nz+1 ; h_0ape(k) = 0.0 ;
enddo 607 do k=1,nz ;
do j=js,je ;
do i=is,ie
608 tmp1(i,j,k) = (0.25 * h_to_kg_m2 * (areatm(i,j) * h(i,j,k))) * &
609 (u(i-1,j,k)**2 + u(i,j,k)**2 + v(i,j-1,k)**2 + v(i,j,k)**2)
610 enddo ;
enddo ;
enddo 615 do k=1,nz+1 ; pe(k) = 0.0 ;
enddo 616 if (cs%do_APE_calc)
then 618 if (gv%Boussinesq)
then 619 do j=js,je ;
do i=is,ie
622 hbelow = hbelow + h(i,j,k) * h_to_m
623 hint = (h_0ape(k) + hbelow - g%bathyT(i,j))
624 hbot = h_0ape(k) - g%bathyT(i,j)
625 hbot = (hbot + abs(hbot)) * 0.5
626 pe_pt(i,j,k) = 0.5 * areatm(i,j) * (gv%Rho0*gv%g_prime(k)) * &
627 (hint * hint - hbot * hbot)
631 do j=js,je ;
do i=is,ie
634 hint = h_0ape(k) + eta(i,j,k)
635 hbot = max(h_0ape(k) - g%bathyT(i,j), 0.0)
636 pe_pt(i,j,k) = 0.5 * (areatm(i,j) * (gv%Rho0*gv%g_prime(k))) * &
637 (hint * hint - hbot * hbot)
643 ke_tot = reproducing_sum(tmp1, sums=ke)
645 if (cs%do_APE_calc) &
646 pe_tot = reproducing_sum(pe_pt, sums=pe)
647 toten = ke_tot + pe_tot
649 salt = 0.0 ; heat = 0.0
650 if (cs%use_temperature)
then 651 temp_int(:,:) = 0.0 ; salt_int(:,:) = 0.0
652 do k=1,nz ;
do j=js,je ;
do i=is,ie
653 salt_int(i,j) = salt_int(i,j) + tv%S(i,j,k) * &
654 (h(i,j,k)*(h_to_kg_m2 * areatm(i,j)))
655 temp_int(i,j) = temp_int(i,j) + (tv%C_p * tv%T(i,j,k)) * &
656 (h(i,j,k)*(h_to_kg_m2 * areatm(i,j)))
657 enddo ;
enddo ;
enddo 658 salt = reproducing_sum(salt_int, efp_sum=salt_efp)
659 heat = reproducing_sum(temp_int, efp_sum=heat_efp)
664 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
665 if (u(i,j,k) < 0.0)
then 666 cfl_trans = (-u(i,j,k) * cs%dt) * (g%dy_Cu(i,j) * g%IareaT(i+1,j))
668 cfl_trans = (u(i,j,k) * cs%dt) * (g%dy_Cu(i,j) * g%IareaT(i,j))
670 cfl_lin = abs(u(i,j,k) * cs%dt) * g%IdxCu(i,j)
671 max_cfl(1) = max(max_cfl(1), cfl_trans)
672 max_cfl(2) = max(max_cfl(2), cfl_lin)
673 enddo ;
enddo ;
enddo 674 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
675 if (v(i,j,k) < 0.0)
then 676 cfl_trans = (-v(i,j,k) * cs%dt) * (g%dx_Cv(i,j) * g%IareaT(i,j+1))
678 cfl_trans = (v(i,j,k) * cs%dt) * (g%dx_Cv(i,j) * g%IareaT(i,j))
680 cfl_lin = abs(v(i,j,k) * cs%dt) * g%IdyCv(i,j)
681 max_cfl(1) = max(max_cfl(1), cfl_trans)
682 max_cfl(2) = max(max_cfl(2), cfl_lin)
683 enddo ;
enddo ;
enddo 685 call sum_across_pes(cs%ntrunc)
689 if (ntr_stocks > 0)
call sum_across_pes(tr_stocks,ntr_stocks)
691 call max_across_pes(max_cfl(1))
692 call max_across_pes(max_cfl(2))
693 if (cs%use_temperature .and. cs%previous_calls == 0)
then 694 cs%salt_prev = salt ; cs%net_salt_input = 0.0
695 cs%heat_prev = heat ; cs%net_heat_input = 0.0
697 cs%salt_prev_EFP = salt_efp ; cs%net_salt_in_EFP = real_to_efp(0.0)
698 cs%heat_prev_EFP = heat_efp ; cs%net_heat_in_EFP = real_to_efp(0.0)
702 if (cs%use_temperature)
then 703 salt_chg_efp = salt_efp - cs%salt_prev_EFP
704 salt_anom_efp = salt_chg_efp - cs%net_salt_in_EFP
705 salt_chg = efp_to_real(salt_chg_efp) ; salt_anom = efp_to_real(salt_anom_efp)
706 heat_chg_efp = heat_efp - cs%heat_prev_EFP
707 heat_anom_efp = heat_chg_efp - cs%net_heat_in_EFP
708 heat_chg = efp_to_real(heat_chg_efp) ; heat_anom = efp_to_real(heat_anom_efp)
711 mass_chg_efp = mass_efp - cs%mass_prev_EFP
713 if (gv%Boussinesq)
then 714 mass_anom_efp = mass_chg_efp - cs%fresh_water_in_EFP
717 mass_anom_efp = mass_chg_efp - cs%fresh_water_in_EFP
718 if (cs%use_temperature) &
719 salin_mass_in = 0.001*efp_to_real(cs%net_salt_in_EFP)
721 mass_chg = efp_to_real(mass_chg_efp)
722 mass_anom = efp_to_real(mass_anom_efp) - salin_mass_in
724 if (cs%use_temperature)
then 725 salin = salt / mass_tot ; salin_anom = salt_anom / mass_tot
727 temp = heat / (mass_tot*tv%C_p) ; temp_anom = heat_anom / (mass_tot*tv%C_p)
729 en_mass = toten / mass_tot
731 call get_time(day, start_of_day, num_days)
732 date_stamped = (cs%date_stamped_output .and. (get_calendar_type() /= no_calendar))
734 call get_date(day, iyear, imonth, iday, ihour, iminute, isecond, itick)
735 if (abs(cs%timeunit - 86400.0) < 1.0)
then 736 reday =
REAL(num_days)+ (
REAL(start_of_day)/86400.0)
737 mesg_intro =
"MOM Day " 739 reday =
REAL(num_days)*(86400.0/cs%timeunit) + &
740 REAL(start_of_day)/abs(cs%timeunit)
741 mesg_intro =
"MOM Time " 743 if (reday < 1.0e8)
then ;
write(day_str,
'(F12.3)') reday
744 elseif (reday < 1.0e11)
then ;
write(day_str,
'(F15.3)') reday
745 else ;
write(day_str,
'(ES15.9)') reday ;
endif 747 if (n < 1000000)
then ;
write(n_str,
'(I6)') n
748 elseif (n < 10000000)
then ;
write(n_str,
'(I7)') n
749 elseif (n < 100000000)
then ;
write(n_str,
'(I8)') n
750 else ;
write(n_str,
'(I10)') n ;
endif 752 if (date_stamped)
then 753 write(date_str,
'("MOM Date",i7,2("/",i2.2)," ",i2.2,2(":",i2.2))') &
754 iyear, imonth, iday, ihour, iminute, isecond
756 date_str = trim(mesg_intro)//trim(day_str)
759 if (is_root_pe())
then 760 if (cs%use_temperature)
then 761 write(*,
'(A," ",A,": En ",ES12.6, ", MaxCFL ", F8.5, ", Mass ", & 762 & ES18.12, ", Salt ", F15.11,", Temp ", F15.11)') &
763 trim(date_str), trim(n_str), en_mass, max_cfl(1), mass_tot, salin, temp
765 write(*,
'(A," ",A,": En ",ES12.6, ", MaxCFL ", F8.5, ", Mass ", & 767 trim(date_str), trim(n_str), en_mass, max_cfl(1), mass_tot
770 if (cs%use_temperature)
then 771 write(cs%fileenergy_ascii,
'(A,",",A,",", I6,", En ",ES18.12, & 772 &", CFL ", F8.5, ", SL ",& 773 &es11.4,", M ",ES11.5,", S",f8.4,", T",f8.4,& 774 &", Me ",ES9.2,", Se ",ES9.2,", Te ",ES9.2)') &
775 trim(n_str), trim(day_str), cs%ntrunc, en_mass, max_cfl(1), &
776 -h_0ape(1), mass_tot, salin, temp, mass_anom/mass_tot, salin_anom, &
779 write(cs%fileenergy_ascii,
'(A,",",A,",", I6,", En ",ES18.12, & 780 &", CFL ", F8.5, ", SL ",& 781 &ES11.4,", Mass ",ES11.5,", Me ",ES9.2)') &
782 trim(n_str), trim(day_str), cs%ntrunc, en_mass, max_cfl(1), &
783 -h_0ape(1), mass_tot, mass_anom/mass_tot
786 if (cs%ntrunc > 0)
then 787 write(*,
'(A," Energy/Mass:",ES12.5," Truncations ",I0)') &
788 trim(date_str), en_mass, cs%ntrunc
791 if (cs%write_stocks)
then 792 write(*,
'(" Total Energy: ",Z16.16,ES24.16)') toten, toten
793 write(*,
'(" Total Mass: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5," (",ES8.1,")")') &
794 mass_tot, mass_chg, mass_anom, mass_anom/mass_tot
795 if (cs%use_temperature)
then 797 write(*,
'(" Total Salt: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5)') &
798 salt*0.001, salt_chg*0.001, salt_anom*0.001
800 write(*,
'(" Total Salt: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5," (",ES8.1,")")') &
801 salt*0.001, salt_chg*0.001, salt_anom*0.001, salt_anom/salt
804 write(*,
'(" Total Heat: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5)') &
805 heat, heat_chg, heat_anom
807 write(*,
'(" Total Heat: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5," (",ES8.1,")")') &
808 heat, heat_chg, heat_anom, heat_anom/heat
813 write(*,
'(" Total ",a,": ",ES24.16,X,a)') &
814 trim(tr_names(m)), tr_stocks(m), trim(tr_units(m))
816 if(tr_minmax_got(m))
then 817 write(*,
'(64X,"Global Min:",ES24.16,X,"at: (", f7.2,","f7.2,","f8.2,")" )') &
818 tr_min(m),tr_min_x(m),tr_min_y(m),tr_min_z(m)
819 write(*,
'(64X,"Global Max:",ES24.16,X,"at: (", f7.2,","f7.2,","f8.2,")" )') &
820 tr_max(m),tr_max_x(m),tr_max_y(m),tr_max_z(m)
827 var =
real(cs%ntrunc)
828 call write_field(cs%fileenergy_nc, cs%fields(1), var, reday)
829 call write_field(cs%fileenergy_nc, cs%fields(2), toten, reday)
830 call write_field(cs%fileenergy_nc, cs%fields(3), pe, reday)
831 call write_field(cs%fileenergy_nc, cs%fields(4), ke, reday)
832 call write_field(cs%fileenergy_nc, cs%fields(5), h_0ape, reday)
833 call write_field(cs%fileenergy_nc, cs%fields(6), mass_lay, reday)
835 call write_field(cs%fileenergy_nc, cs%fields(7), mass_tot, reday)
836 call write_field(cs%fileenergy_nc, cs%fields(8), mass_chg, reday)
837 call write_field(cs%fileenergy_nc, cs%fields(9), mass_anom, reday)
838 call write_field(cs%fileenergy_nc, cs%fields(10), max_cfl(1), reday)
839 call write_field(cs%fileenergy_nc, cs%fields(11), max_cfl(1), reday)
840 if (cs%use_temperature)
then 841 call write_field(cs%fileenergy_nc, cs%fields(12), 0.001*salt, reday)
842 call write_field(cs%fileenergy_nc, cs%fields(13), 0.001*salt_chg, reday)
843 call write_field(cs%fileenergy_nc, cs%fields(14), 0.001*salt_anom, reday)
844 call write_field(cs%fileenergy_nc, cs%fields(15), heat, reday)
845 call write_field(cs%fileenergy_nc, cs%fields(16), heat_chg, reday)
846 call write_field(cs%fileenergy_nc, cs%fields(17), heat_anom, reday)
848 call write_field(cs%fileenergy_nc, cs%fields(17+m), tr_stocks(m), reday)
852 call write_field(cs%fileenergy_nc, cs%fields(11+m), tr_stocks(m), reday)
856 call flush_file(cs%fileenergy_nc)
859 if ((en_mass>cs%max_Energy) .or. &
860 ((en_mass>cs%max_Energy) .and. (en_mass<cs%max_Energy)))
then 862 write(mesg,
'("Energy per unit mass of ",ES11.4," exceeds ",ES11.4)') &
863 en_mass, cs%max_Energy
864 call mom_error(warning,
"write_energy : "//trim(mesg))
865 call mom_error(warning, &
866 "write_energy : Time set to a large value to force model termination.")
868 if (cs%ntrunc>cs%maxtrunc)
then 870 call mom_error(fatal,
"write_energy : Ocean velocity has been truncated too many times.")
873 cs%previous_calls = cs%previous_calls + 1
874 cs%mass_prev = mass_tot ; cs%fresh_water_input = 0.0
875 if (cs%use_temperature)
then 876 cs%salt_prev = salt ; cs%net_salt_input = 0.0
877 cs%heat_prev = heat ; cs%net_heat_input = 0.0
880 cs%mass_prev_EFP = mass_efp ; cs%fresh_water_in_EFP = real_to_efp(0.0)
881 if (cs%use_temperature)
then 882 cs%salt_prev_EFP = salt_efp ; cs%net_salt_in_EFP = real_to_efp(0.0)
883 cs%heat_prev_EFP = heat_efp ; cs%net_heat_in_EFP = real_to_efp(0.0)
Ocean grid type. See mom_grid for details.