This subroutine calculates and writes the total model energy, the energy and mass of each layer, and other globally integrated physical quantities.
304 type(ocean_grid_type),
intent(in) :: G
305 type(verticalGrid_type),
intent(in) :: GV
306 type(unit_scale_type),
intent(in) :: US
307 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
309 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
311 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
313 type(thermo_var_ptrs),
intent(in) :: tv
315 type(time_type),
intent(in) :: day
316 integer,
intent(in) :: n
318 type(Sum_output_CS),
pointer :: CS
320 type(tracer_flow_control_CS), &
321 optional,
pointer :: tracer_CSp
322 type(ocean_OBC_type), &
323 optional,
pointer :: OBC
324 type(time_type),
optional,
intent(in) :: dt_forcing
326 real :: eta(SZI_(G),SZJ_(G),SZK_(G)+1)
327 real :: areaTm(SZI_(G),SZJ_(G))
329 real :: PE(SZK_(G)+1)
332 real :: Z_0APE(SZK_(G)+1)
334 real :: H_0APE(SZK_(G)+1)
339 real :: vol_lay(SZK_(G))
341 real :: mass_lay(SZK_(G))
358 real :: salin_mass_in
377 salt_EFP, heat_EFP, salt_chg_EFP, heat_chg_EFP, mass_chg_EFP, &
378 mass_anom_EFP, salt_anom_EFP, heat_anom_EFP
383 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
385 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1) :: &
387 real,
dimension(SZI_(G),SZJ_(G)) :: &
390 integer :: num_nc_fields
392 integer :: i, j, k, is, ie, js, je, ns, nz, m, Isq, Ieq, Jsq, Jeq
393 integer :: l, lbelow, labove
396 integer :: start_of_day, num_days
398 character(len=240) :: energypath_nc
399 character(len=200) :: mesg
400 character(len=32) :: mesg_intro, time_units, day_str, n_str, date_str
401 logical :: date_stamped
402 type(time_type) :: dt_force
403 real :: Tr_stocks(MAX_FIELDS_)
404 real :: Tr_min(MAX_FIELDS_), Tr_max(MAX_FIELDS_)
405 real :: Tr_min_x(MAX_FIELDS_), Tr_min_y(MAX_FIELDS_), Tr_min_z(MAX_FIELDS_)
406 real :: Tr_max_x(MAX_FIELDS_), Tr_max_y(MAX_FIELDS_), Tr_max_z(MAX_FIELDS_)
407 logical :: Tr_minmax_got(MAX_FIELDS_) = .false.
408 character(len=40),
dimension(MAX_FIELDS_) :: &
410 integer :: nTr_stocks
411 integer :: iyear, imonth, iday, ihour, iminute, isecond, itick
412 logical :: local_open_BC
413 type(OBC_segment_type),
pointer :: segment => null()
416 type(vardesc) :: vars(NUM_FIELDS+MAX_FIELDS_)
419 dt_force = set_time(seconds=2) ;
if (
present(dt_forcing)) dt_force = dt_forcing
420 if (cs%previous_calls == 0)
then
421 if (cs%energysave_geometric)
then
422 if (cs%energysavedays_geometric < cs%energysavedays)
then
423 cs%write_energy_time = day + cs%energysavedays_geometric
424 cs%geometric_end_time = cs%Start_time + cs%energysavedays * &
425 (1 + (day - cs%Start_time) / cs%energysavedays)
427 cs%write_energy_time = cs%Start_time + cs%energysavedays * &
428 (1 + (day - cs%Start_time) / cs%energysavedays)
431 cs%write_energy_time = cs%Start_time + cs%energysavedays * &
432 (1 + (day - cs%Start_time) / cs%energysavedays)
434 elseif (day + (dt_force/2) <= cs%write_energy_time)
then
437 if (cs%energysave_geometric)
then
438 if (cs%write_energy_time + cs%energysavedays_geometric >= &
439 cs%geometric_end_time)
then
440 cs%write_energy_time = cs%geometric_end_time
441 cs%energysave_geometric = .false.
443 cs%write_energy_time = cs%write_energy_time + cs%energysavedays_geometric
445 cs%energysavedays_geometric = cs%energysavedays_geometric*2
447 cs%write_energy_time = cs%write_energy_time + cs%energysavedays
452 if (.not.cs%use_temperature) num_nc_fields = 11
453 vars(1) = var_desc(
"Ntrunc",
"Nondim",
"Number of Velocity Truncations",
'1',
'1')
454 vars(2) = var_desc(
"En",
"Joules",
"Total Energy",
'1',
'1')
455 vars(3) = var_desc(
"APE",
"Joules",
"Total Interface APE",
'1',
'i')
456 vars(4) = var_desc(
"KE",
"Joules",
"Total Layer KE",
'1',
'L')
457 vars(5) = var_desc(
"H0",
"meter",
"Zero APE Depth of Interface",
'1',
'i')
458 vars(6) = var_desc(
"Mass_lay",
"kg",
"Total Layer Mass",
'1',
'L')
459 vars(7) = var_desc(
"Mass",
"kg",
"Total Mass",
'1',
'1')
460 vars(8) = var_desc(
"Mass_chg",
"kg",
"Total Mass Change between Entries",
'1',
'1')
461 vars(9) = var_desc(
"Mass_anom",
"kg",
"Anomalous Total Mass Change",
'1',
'1')
462 vars(10) = var_desc(
"max_CFL_trans",
"Nondim",
"Maximum finite-volume CFL",
'1',
'1')
463 vars(11) = var_desc(
"max_CFL_lin",
"Nondim",
"Maximum finite-difference CFL",
'1',
'1')
464 if (cs%use_temperature)
then
465 vars(12) = var_desc(
"Salt",
"kg",
"Total Salt",
'1',
'1')
466 vars(13) = var_desc(
"Salt_chg",
"kg",
"Total Salt Change between Entries",
'1',
'1')
467 vars(14) = var_desc(
"Salt_anom",
"kg",
"Anomalous Total Salt Change",
'1',
'1')
468 vars(15) = var_desc(
"Heat",
"Joules",
"Total Heat",
'1',
'1')
469 vars(16) = var_desc(
"Heat_chg",
"Joules",
"Total Heat Change between Entries",
'1',
'1')
470 vars(17) = var_desc(
"Heat_anom",
"Joules",
"Anomalous Total Heat Change",
'1',
'1')
473 local_open_bc = .false.
474 if (
present(obc))
then ;
if (
associated(obc))
then
475 local_open_bc = (obc%open_u_BCs_exist_globally .or. obc%open_v_BCs_exist_globally)
478 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
479 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
480 h_to_kg_m2 = gv%H_to_kg_m2
482 if (.not.
associated(cs))
call mom_error(fatal, &
483 "write_energy: Module must be initialized before it is used.")
485 do j=js,je ;
do i=is,ie
486 areatm(i,j) = g%mask2dT(i,j)*g%areaT(i,j)
489 if (gv%Boussinesq)
then
491 do k=1,nz ;
do j=js,je ;
do i=is,ie
492 tmp1(i,j,k) = h(i,j,k) * (h_to_kg_m2*areatm(i,j))
493 enddo ;
enddo ;
enddo
498 if (local_open_bc)
then
499 do ns=1, obc%number_of_segments
500 segment => obc%segment(ns)
501 if (.not. segment%on_pe .or. segment%specified) cycle
502 i=segment%HI%IsdB ; j=segment%HI%JsdB
503 if (segment%direction == obc_direction_e)
then
504 do k=1,nz ;
do j=segment%HI%jsd,segment%HI%jed
507 elseif (segment%direction == obc_direction_w)
then
508 do k=1,nz ;
do j=segment%HI%jsd,segment%HI%jed
511 elseif (segment%direction == obc_direction_n)
then
512 do k=1,nz ;
do i=segment%HI%isd,segment%HI%ied
515 elseif (segment%direction == obc_direction_s)
then
516 do k=1,nz ;
do i=segment%HI%isd,segment%HI%ied
524 do k=1,nz ; vol_lay(k) = (gv%H_to_Z/h_to_kg_m2)*mass_lay(k) ;
enddo
527 if (cs%do_APE_calc)
then
528 do k=1,nz ;
do j=js,je ;
do i=is,ie
529 tmp1(i,j,k) = h_to_kg_m2 * h(i,j,k) * areatm(i,j)
530 enddo ;
enddo ;
enddo
533 call find_eta(h, tv, g, gv, us, eta)
534 do k=1,nz ;
do j=js,je ;
do i=is,ie
535 tmp1(i,j,k) = (eta(i,j,k)-eta(i,j,k+1)) * areatm(i,j)
536 enddo ;
enddo ;
enddo
539 do k=1,nz ;
do j=js,je ;
do i=is,ie
540 tmp1(i,j,k) = h_to_kg_m2 * h(i,j,k) * areatm(i,j)
541 enddo ;
enddo ;
enddo
543 do k=1,nz ; vol_lay(k) = us%m_to_Z * (mass_lay(k) / gv%Rho0) ;
enddo
548 if (
present(tracer_csp))
then
549 call call_tracer_stocks(h, tr_stocks, g, gv, tracer_csp, stock_names=tr_names, &
550 stock_units=tr_units, num_stocks=ntr_stocks,&
551 got_min_max=tr_minmax_got, global_min=tr_min, global_max=tr_max, &
552 xgmin=tr_min_x, ygmin=tr_min_y, zgmin=tr_min_z,&
553 xgmax=tr_max_x, ygmax=tr_max_y, zgmax=tr_max_z)
554 if (ntr_stocks > 0)
then
556 vars(num_nc_fields+m) = var_desc(tr_names(m), units=tr_units(m), &
557 longname=tr_names(m), hor_grid=
'1', z_grid=
'1')
559 num_nc_fields = num_nc_fields + ntr_stocks
563 if (cs%previous_calls == 0)
then
564 cs%mass_prev = mass_tot ; cs%fresh_water_input = 0.0
566 cs%mass_prev_EFP = mass_efp
567 cs%fresh_water_in_EFP = real_to_efp(0.0)
570 if (is_root_pe())
then
571 if (day > cs%Start_time)
then
572 call open_file(cs%fileenergy_ascii, trim(cs%energyfile), &
573 action=append_file, form=ascii_file, nohdrs=.true.)
575 call open_file(cs%fileenergy_ascii, trim(cs%energyfile), &
576 action=writeonly_file, form=ascii_file, nohdrs=.true.)
577 if (abs(cs%timeunit - 86400.0) < 1.0)
then
578 if (cs%use_temperature)
then
579 write(cs%fileenergy_ascii,
'(" Step,",7x,"Day, Truncs, &
580 &Energy/Mass, Maximum CFL, Mean Sea Level, Total Mass, Mean Salin, &
581 &Mean Temp, Frac Mass Err, Salin Err, Temp Err")')
582 write(cs%fileenergy_ascii,
'(12x,"[days]",17x,"[m2 s-2]",11x,"[Nondim]",7x,"[m]",13x,&
583 &"[kg]",9x,"[PSU]",6x,"[degC]",7x,"[Nondim]",8x,"[PSU]",8x,"[degC]")')
585 write(cs%fileenergy_ascii,
'(" Step,",7x,"Day, Truncs, &
586 &Energy/Mass, Maximum CFL, Mean sea level, Total Mass, Frac Mass Err")')
587 write(cs%fileenergy_ascii,
'(12x,"[days]",17x,"[m2 s-2]",11x,"[Nondim]",8x,"[m]",13x,&
588 &"[kg]",11x,"[Nondim]")')
591 if ((cs%timeunit >= 0.99) .and. (cs%timeunit < 1.01))
then
592 time_units =
" [seconds] "
593 elseif ((cs%timeunit >= 3599.0) .and. (cs%timeunit < 3601.0))
then
594 time_units =
" [hours] "
595 elseif ((cs%timeunit >= 86399.0) .and. (cs%timeunit < 86401.0))
then
596 time_units =
" [days] "
597 elseif ((cs%timeunit >= 3.0e7) .and. (cs%timeunit < 3.2e7))
then
598 time_units =
" [years] "
600 write(time_units,
'(9x,"[",es8.2," s] ")') cs%timeunit
603 if (cs%use_temperature)
then
604 write(cs%fileenergy_ascii,
'(" Step,",7x,"Time, Truncs, &
605 &Energy/Mass, Maximum CFL, Mean Sea Level, Total Mass, Mean Salin, &
606 &Mean Temp, Frac Mass Err, Salin Err, Temp Err")')
607 write(cs%fileenergy_ascii,
'(A25,10x,"[m2 s-2]",11x,"[Nondim]",7x,"[m]",13x,&
608 &"[kg]",9x,"[PSU]",6x,"[degC]",7x,"[Nondim]",8x,"[PSU]",6x,&
609 &"[degC]")') time_units
611 write(cs%fileenergy_ascii,
'(" Step,",7x,"Time, Truncs, &
612 &Energy/Mass, Maximum CFL, Mean sea level, Total Mass, Frac Mass Err")')
613 write(cs%fileenergy_ascii,
'(A25,10x,"[m2 s-2]",11x,"[Nondim]",8x,"[m]",13x,&
614 &"[kg]",11x,"[Nondim]")') time_units
620 energypath_nc = trim(cs%energyfile) //
".nc"
621 if (day > cs%Start_time)
then
622 call reopen_file(cs%fileenergy_nc, trim(energypath_nc), vars, &
623 num_nc_fields, cs%fields, single_file, cs%timeunit, &
626 call create_file(cs%fileenergy_nc, trim(energypath_nc), vars, &
627 num_nc_fields, cs%fields, single_file, cs%timeunit, &
632 if (cs%do_APE_calc)
then
633 lbelow = 1 ; volbelow = 0.0
635 volbelow = volbelow + vol_lay(k)
636 if ((volbelow >= cs%DL(cs%lH(k))%vol_below) .and. &
637 (volbelow < cs%DL(cs%lH(k)+1)%vol_below))
then
640 labove=cs%list_size+1
641 l = (labove + lbelow) / 2
642 do while (l > lbelow)
643 if (volbelow < cs%DL(l)%vol_below)
then ; labove = l
644 else ; lbelow = l ;
endif
645 l = (labove + lbelow) / 2
650 z_0ape(k) = cs%DL(l)%depth - (volbelow - cs%DL(l)%vol_below) / cs%DL(l)%area
652 z_0ape(nz+1) = cs%DL(2)%depth
659 if (gv%Boussinesq)
then
660 do j=js,je ;
do i=is,ie
663 hbelow = hbelow + h(i,j,k) * gv%H_to_Z
664 hint = z_0ape(k) + (hbelow - g%bathyT(i,j))
665 hbot = z_0ape(k) - g%bathyT(i,j)
666 hbot = (hbot + abs(hbot)) * 0.5
667 pe_pt(i,j,k) = 0.5 * areatm(i,j) * us%Z_to_m*(gv%Rho0*us%L_to_m**2*us%s_to_T**2*gv%g_prime(k)) * &
668 (hint * hint - hbot * hbot)
672 do j=js,je ;
do i=is,ie
674 hint = z_0ape(k) + eta(i,j,k)
675 hbot = max(z_0ape(k) - g%bathyT(i,j), 0.0)
676 pe_pt(i,j,k) = 0.5 * (areatm(i,j) * us%Z_to_m*(gv%Rho0*us%L_to_m**2*us%s_to_T**2*gv%g_prime(k))) * &
677 (hint * hint - hbot * hbot)
683 do k=1,nz+1 ; h_0ape(k) = us%Z_to_m*z_0ape(k) ;
enddo
686 do k=1,nz+1 ; pe(k) = 0.0 ; h_0ape(k) = 0.0 ;
enddo
691 do k=1,nz ;
do j=js,je ;
do i=is,ie
692 tmp1(i,j,k) = (0.25 * h_to_kg_m2 * (areatm(i,j) * h(i,j,k))) * &
693 (u(i-1,j,k)**2 + u(i,j,k)**2 + v(i,j-1,k)**2 + v(i,j,k)**2)
694 enddo ;
enddo ;
enddo
697 toten = ke_tot + pe_tot
699 salt = 0.0 ; heat = 0.0
700 if (cs%use_temperature)
then
701 temp_int(:,:) = 0.0 ; salt_int(:,:) = 0.0
702 do k=1,nz ;
do j=js,je ;
do i=is,ie
703 salt_int(i,j) = salt_int(i,j) + tv%S(i,j,k) * &
704 (h(i,j,k)*(h_to_kg_m2 * areatm(i,j)))
705 temp_int(i,j) = temp_int(i,j) + (tv%C_p * tv%T(i,j,k)) * &
706 (h(i,j,k)*(h_to_kg_m2 * areatm(i,j)))
707 enddo ;
enddo ;
enddo
714 do k=1,nz ;
do j=js,je ;
do i=isq,ieq
715 if (u(i,j,k) < 0.0)
then
716 cfl_trans = (-u(i,j,k) * cs%dt) * (g%dy_Cu(i,j) * g%IareaT(i+1,j))
718 cfl_trans = (u(i,j,k) * cs%dt) * (g%dy_Cu(i,j) * g%IareaT(i,j))
720 cfl_lin = abs(u(i,j,k) * cs%dt) * g%IdxCu(i,j)
721 max_cfl(1) = max(max_cfl(1), cfl_trans)
722 max_cfl(2) = max(max_cfl(2), cfl_lin)
723 enddo ;
enddo ;
enddo
724 do k=1,nz ;
do j=jsq,jeq ;
do i=is,ie
725 if (v(i,j,k) < 0.0)
then
726 cfl_trans = (-v(i,j,k) * cs%dt) * (g%dx_Cv(i,j) * g%IareaT(i,j+1))
728 cfl_trans = (v(i,j,k) * cs%dt) * (g%dx_Cv(i,j) * g%IareaT(i,j))
730 cfl_lin = abs(v(i,j,k) * cs%dt) * g%IdyCv(i,j)
731 max_cfl(1) = max(max_cfl(1), cfl_trans)
732 max_cfl(2) = max(max_cfl(2), cfl_lin)
733 enddo ;
enddo ;
enddo
735 call sum_across_pes(cs%ntrunc)
739 if (ntr_stocks > 0)
call sum_across_pes(tr_stocks,ntr_stocks)
741 call max_across_pes(max_cfl(1))
742 call max_across_pes(max_cfl(2))
743 if (cs%use_temperature .and. cs%previous_calls == 0)
then
744 cs%salt_prev = salt ; cs%net_salt_input = 0.0
745 cs%heat_prev = heat ; cs%net_heat_input = 0.0
747 cs%salt_prev_EFP = salt_efp ; cs%net_salt_in_EFP = real_to_efp(0.0)
748 cs%heat_prev_EFP = heat_efp ; cs%net_heat_in_EFP = real_to_efp(0.0)
752 if (cs%use_temperature)
then
753 salt_chg_efp = salt_efp - cs%salt_prev_EFP
754 salt_anom_efp = salt_chg_efp - cs%net_salt_in_EFP
755 salt_chg = efp_to_real(salt_chg_efp) ; salt_anom = efp_to_real(salt_anom_efp)
756 heat_chg_efp = heat_efp - cs%heat_prev_EFP
757 heat_anom_efp = heat_chg_efp - cs%net_heat_in_EFP
758 heat_chg = efp_to_real(heat_chg_efp) ; heat_anom = efp_to_real(heat_anom_efp)
761 mass_chg_efp = mass_efp - cs%mass_prev_EFP
763 if (gv%Boussinesq)
then
764 mass_anom_efp = mass_chg_efp - cs%fresh_water_in_EFP
767 mass_anom_efp = mass_chg_efp - cs%fresh_water_in_EFP
768 if (cs%use_temperature) &
769 salin_mass_in = 0.001*efp_to_real(cs%net_salt_in_EFP)
771 mass_chg = efp_to_real(mass_chg_efp)
772 mass_anom = efp_to_real(mass_anom_efp) - salin_mass_in
774 if (cs%use_temperature)
then
775 salin = salt / mass_tot ; salin_anom = salt_anom / mass_tot
777 temp = heat / (mass_tot*tv%C_p) ; temp_anom = heat_anom / (mass_tot*tv%C_p)
779 en_mass = toten / mass_tot
781 call get_time(day, start_of_day, num_days)
782 date_stamped = (cs%date_stamped_output .and. (get_calendar_type() /= no_calendar))
784 call get_date(day, iyear, imonth, iday, ihour, iminute, isecond, itick)
785 if (abs(cs%timeunit - 86400.0) < 1.0)
then
786 reday = real(num_days)+ (real(start_of_day)/86400.0)
787 mesg_intro =
"MOM Day "
789 reday = real(num_days)*(86400.0/cs%timeunit) + &
790 REAL(start_of_day)/abs(CS%timeunit)
791 mesg_intro =
"MOM Time "
793 if (reday < 1.0e8)
then ;
write(day_str,
'(F12.3)') reday
794 elseif (reday < 1.0e11)
then ;
write(day_str,
'(F15.3)') reday
795 else ;
write(day_str,
'(ES15.9)') reday ;
endif
797 if (n < 1000000)
then ;
write(n_str,
'(I6)') n
798 elseif (n < 10000000)
then ;
write(n_str,
'(I7)') n
799 elseif (n < 100000000)
then ;
write(n_str,
'(I8)') n
800 else ;
write(n_str,
'(I10)') n ;
endif
802 if (date_stamped)
then
803 write(date_str,
'("MOM Date",i7,2("/",i2.2)," ",i2.2,2(":",i2.2))') &
804 iyear, imonth, iday, ihour, iminute, isecond
806 date_str = trim(mesg_intro)//trim(day_str)
809 if (is_root_pe())
then
810 if (cs%use_temperature)
then
811 write(*,
'(A," ",A,": En ",ES12.6, ", MaxCFL ", F8.5, ", Mass ", &
812 & ES18.12, ", Salt ", F15.11,", Temp ", F15.11)') &
813 trim(date_str), trim(n_str), en_mass, max_cfl(1), mass_tot, salin, temp
815 write(*,
'(A," ",A,": En ",ES12.6, ", MaxCFL ", F8.5, ", Mass ", &
817 trim(date_str), trim(n_str), en_mass, max_cfl(1), mass_tot
820 if (cs%use_temperature)
then
821 write(cs%fileenergy_ascii,
'(A,",",A,",", I6,", En ",ES22.16, &
822 &", CFL ", F8.5, ", SL ",&
823 &es11.4,", M ",ES11.5,", S",f8.4,", T",f8.4,&
824 &", Me ",ES9.2,", Se ",ES9.2,", Te ",ES9.2)') &
825 trim(n_str), trim(day_str), cs%ntrunc, en_mass, max_cfl(1), &
826 -h_0ape(1), mass_tot, salin, temp, mass_anom/mass_tot, salin_anom, &
829 write(cs%fileenergy_ascii,
'(A,",",A,",", I6,", En ",ES22.16, &
830 &", CFL ", F8.5, ", SL ",&
831 &ES11.4,", Mass ",ES11.5,", Me ",ES9.2)') &
832 trim(n_str), trim(day_str), cs%ntrunc, en_mass, max_cfl(1), &
833 -h_0ape(1), mass_tot, mass_anom/mass_tot
836 if (cs%ntrunc > 0)
then
837 write(*,
'(A," Energy/Mass:",ES12.5," Truncations ",I0)') &
838 trim(date_str), en_mass, cs%ntrunc
841 if (cs%write_stocks)
then
842 write(*,
'(" Total Energy: ",Z16.16,ES24.16)') toten, toten
843 write(*,
'(" Total Mass: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5," (",ES8.1,")")') &
844 mass_tot, mass_chg, mass_anom, mass_anom/mass_tot
845 if (cs%use_temperature)
then
847 write(*,
'(" Total Salt: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5)') &
848 salt*0.001, salt_chg*0.001, salt_anom*0.001
850 write(*,
'(" Total Salt: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5," (",ES8.1,")")') &
851 salt*0.001, salt_chg*0.001, salt_anom*0.001, salt_anom/salt
854 write(*,
'(" Total Heat: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5)') &
855 heat, heat_chg, heat_anom
857 write(*,
'(" Total Heat: ",ES24.16,", Change: ",ES24.16," Error: ",ES12.5," (",ES8.1,")")') &
858 heat, heat_chg, heat_anom, heat_anom/heat
863 write(*,
'(" Total ",a,": ",ES24.16,X,a)') &
864 trim(tr_names(m)), tr_stocks(m), trim(tr_units(m))
866 if (tr_minmax_got(m))
then
867 write(*,
'(64X,"Global Min:",ES24.16,X,"at: (", f7.2,","f7.2,","f8.2,")" )') &
868 tr_min(m),tr_min_x(m),tr_min_y(m),tr_min_z(m)
869 write(*,
'(64X,"Global Max:",ES24.16,X,"at: (", f7.2,","f7.2,","f8.2,")" )') &
870 tr_max(m),tr_max_x(m),tr_max_y(m),tr_max_z(m)
877 var = real(cs%ntrunc)
878 call write_field(cs%fileenergy_nc, cs%fields(1), var, reday)
879 call write_field(cs%fileenergy_nc, cs%fields(2), toten, reday)
880 call write_field(cs%fileenergy_nc, cs%fields(3), pe, reday)
881 call write_field(cs%fileenergy_nc, cs%fields(4), ke, reday)
882 call write_field(cs%fileenergy_nc, cs%fields(5), h_0ape, reday)
883 call write_field(cs%fileenergy_nc, cs%fields(6), mass_lay, reday)
885 call write_field(cs%fileenergy_nc, cs%fields(7), mass_tot, reday)
886 call write_field(cs%fileenergy_nc, cs%fields(8), mass_chg, reday)
887 call write_field(cs%fileenergy_nc, cs%fields(9), mass_anom, reday)
888 call write_field(cs%fileenergy_nc, cs%fields(10), max_cfl(1), reday)
889 call write_field(cs%fileenergy_nc, cs%fields(11), max_cfl(1), reday)
890 if (cs%use_temperature)
then
891 call write_field(cs%fileenergy_nc, cs%fields(12), 0.001*salt, reday)
892 call write_field(cs%fileenergy_nc, cs%fields(13), 0.001*salt_chg, reday)
893 call write_field(cs%fileenergy_nc, cs%fields(14), 0.001*salt_anom, reday)
894 call write_field(cs%fileenergy_nc, cs%fields(15), heat, reday)
895 call write_field(cs%fileenergy_nc, cs%fields(16), heat_chg, reday)
896 call write_field(cs%fileenergy_nc, cs%fields(17), heat_anom, reday)
898 call write_field(cs%fileenergy_nc, cs%fields(17+m), tr_stocks(m), reday)
902 call write_field(cs%fileenergy_nc, cs%fields(11+m), tr_stocks(m), reday)
906 call flush_file(cs%fileenergy_nc)
909 if ((en_mass>cs%max_Energy) .or. &
910 ((en_mass>cs%max_Energy) .and. (en_mass<cs%max_Energy)))
then
911 write(mesg,
'("Energy per unit mass of ",ES11.4," exceeds ",ES11.4)') &
912 en_mass, cs%max_Energy
913 call mom_error(fatal, &
914 "write_energy : Excessive energy per unit mass or NaNs forced model termination.")
916 if (cs%ntrunc>cs%maxtrunc)
then
917 call mom_error(fatal,
"write_energy : Ocean velocity has been truncated too many times.")
920 cs%previous_calls = cs%previous_calls + 1
921 cs%mass_prev = mass_tot ; cs%fresh_water_input = 0.0
922 if (cs%use_temperature)
then
923 cs%salt_prev = salt ; cs%net_salt_input = 0.0
924 cs%heat_prev = heat ; cs%net_heat_input = 0.0
927 cs%mass_prev_EFP = mass_efp ; cs%fresh_water_in_EFP = real_to_efp(0.0)
928 if (cs%use_temperature)
then
929 cs%salt_prev_EFP = salt_efp ; cs%net_salt_in_EFP = real_to_efp(0.0)
930 cs%heat_prev_EFP = heat_efp ; cs%net_heat_in_EFP = real_to_efp(0.0)