Difference between revisions of "UKCA Chemistry and Aerosol vn10.9 Tutorial 11"
Line 166: | Line 166: | ||
File src/atmosphere/UKCA/ukca_light.F90 : |
File src/atmosphere/UKCA/ukca_light.F90 : |
||
Line longer than 80 characters: ' anox(k) = anox(k) + accnox * ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) ' |
Line longer than 80 characters: ' anox(k) = anox(k) + accnox * ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) ' |
||
+ | |||
+ | This is relatively easy to solve by adding a continuation line. |
||
+ | |||
+ | Index: src/atmosphere/UKCA/ukca_light.F90 |
||
+ | =================================================================== |
||
+ | --- src/atmosphere/UKCA/ukca_light.F90 (revision 47427) |
||
+ | +++ src/atmosphere/UKCA/ukca_light.F90 (revision 47436) |
||
+ | @@ -268,7 +268,8 @@ |
||
+ | ! jniv is greater than the cloud-top-height |
||
+ | ! Note: anox(k) is also on the RHS of this equation |
||
+ | DO k = jniv,klt-1 |
||
+ | - anox(k) = anox(k) + accnox * ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) |
||
+ | + anox(k) = anox(k) + accnox * & |
||
+ | + ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) |
||
+ | END DO |
||
+ | END IF |
||
+ | ELSE ! .not. l_ukca_linox_logp |
||
+ | |||
+ | See https://code.metoffice.gov.uk/trac/um/changeset/47436 |
||
+ | |||
+ | If you make this change and then <code>fcm commit</code> you can then re-run the <code>umdp3_check</code> task again. |
||
+ | |||
+ | rose stem --group=umdp3_check |
||
+ | |||
+ | You should find that it passes successfully. |
||
===<code>fcm_make_vm_gnu_um_safe_noomp</code>=== |
===<code>fcm_make_vm_gnu_um_safe_noomp</code>=== |
Revision as of 15:48, 13 December 2017
UKCA Chemistry and Aerosol Tutorials at vn10.9
What you will learn in this Tutorial
In this tutorial you will go through a worked example showing you how to commit code to the UM trunk.
You should also open the working practices for the UM page on MOSRS and read through that as well.
This can only be completed on the Virtual Machine, as rose-stem does not currently work on ARCHER.
Before you start this Tutorial
Before you start this tutorial you will need to have a working Virtual Machine where known good output (or KGO) has been installed for the vm_n48_ukca_eg_noomp
. You can do this by running the command
rose stem --group=vm_n48_ukca_eg_noomp -S GENERATE_KGO=true
within a vanilla copy of the vn10.9 trunk. When this runs for the first time the two KGO tasks will fail, but when this happens the KGO is installed. You just need to re-trigger these two tasks to run again, and they will succeed and the suite will stop.
For more information on the VM you should read-through umdp_X10.
Create a ticket
You will need to fill-in several headings. These can all be changed later if needed.
- Summary: Give a short description of what the change is for.
- Description: Give a longer and more detailed description.
- Type: Putting enhancement is usually fine here.
- Milestone: This should be the UM (or Mule) version that you are targeting. If you don't know a particular version leave this as Hopefully, and if you aren't targeting a version then you can put this as Not for Builds. In this example please use Not for Builds.
- Severity: Usually changes will be minor or significant, depending on if results are changed. Usually wholesale and trivial aren't used very often. This doesn't matter too much, as the Code Reviewer will often change this during their review.
- Keywords: When working on UKCA, please include UKCA and SC0138 (this is to make it easy to search for UKCA tickets)
Once you have created it, you should Modify it and start work and then click submit. This will change the ownership to you and change the ticket statue to in_progress. You will now be able to find your ticket on your view tickets page.
You can find an example of this here: um:#3639.
Make a branch
Please make a branch as covered in Tutorial 4, e.g.
fcm branch-create --type dev -k ticket_number your_branch_name fcm:um.x_tr@vn10.9
and then check-out your branch by
fcm checkout fcm:um.x_br/dev/userid/vn10.9_your_branch_name
Merge in Initial Changes
You should merge-in branch dev/lukeabraham/vn10.9_UKCA_Worked_Example
by changing into the top-level directory of your branch and doing
fcm merge fcm:um.x_br/dev/lukeabraham/vn10.9_UKCA_Worked_Example@47427
(Note: the revision number 47427 is important here) and then fcm commit
your branch.
The code that you are checking in can be found here: https://code.metoffice.gov.uk/trac/um/changeset/47427
Index: src/atmosphere/UKCA/ukca_light.F90 =================================================================== --- src/atmosphere/UKCA/ukca_light.F90 (revision 47420) +++ src/atmosphere/UKCA/ukca_light.F90 (revision 47427) @@ -241,27 +241,60 @@ ! 3 from cloud base to 2 above top ! KLT is the level above cloud top - dpcg = ppress(1) - ppress(jniv) - dpcc = ppress(jniv) - ppress(klt) + IF (l_ukca_linox_logp) THEN + ! DO EVERYTHING LINEARLY IN LOG(PRESSURE) + ! sanity check to prevent dpcg==0 + IF (jniv <= 1) jniv=2 + + dpcg = LOG(ppress(1)) - LOG(ppress(jniv)) + dpcc = LOG(ppress(jniv)) - LOG(ppress(klt)) + ! ...construct L-NOx profile in kg(N)/gridcell/s + ! ...first cloud-to-ground L-NOx profiles (kg(N)/gridcell/s) + IF ((jniv-1) == 1) THEN + anox(1) = acgnox + ELSE + DO k = 1,jniv-1 + anox(k) = acgnox * ((LOG(ppress(k))-LOG(ppress(k+1)))/dpcg) + END DO + END IF + + ! ...then cloud-to-cloud L-NOx profiles (kg(N)/gridcell/s) + IF (LOG(ppress(jniv)) <= LOG(ppress(klt))) THEN + ! jniv (level of the 500hPa level) is above the + ! cloud-top-height. In this case, put all C2C N + ! into the cloud-top level. + anox(klt-1) = anox(klt-1) + accnox + ELSE + ! jniv is greater than the cloud-top-height + ! Note: anox(k) is also on the RHS of this equation + DO k = jniv,klt-1 + anox(k) = anox(k) + accnox * ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) + END DO + END IF + ELSE ! .not. l_ukca_linox_logp + ! DO EVERYTHING LINEARLY IN PRESSURE + dpcg = ppress(1) - ppress(jniv) + dpcc = ppress(jniv) - ppress(klt) + ! ...construct L-NOx profile in kg(N)/gridcell/s + ! ...first cloud-to-ground L-NOx profiles (kg(N)/gridcell/s) + IF ((jniv-1) == 1) THEN + anox(1) = acgnox + ELSE + DO k = 1,jniv-1 + anox(k) = acgnox * ((ppress(k)-ppress(k+1))/dpcg) + END DO + END IF + + ! ...then cloud-to-cloud L-NOx profiles (kg(N)/gridcell/s) + IF (ppress(jniv) <= ppress(klt)) THEN + anox(klt-1) = anox(klt-1) + accnox + ELSE + DO k = jniv,klt-1 + anox(k) = accnox * ((ppress(k)-ppress(k+1))/dpcc) + END DO + END IF + END IF ! l_ukca_linox_logp - ! ...construct L-NOx profile in kg(N)/gridcell/s - ! ...first cloud-to-ground L-NOx profiles (kg(N)/gridcell/s) - IF ((jniv-1) == 1) THEN - anox(1) = acgnox - ELSE - DO k = 1,jniv-1 - anox(k) = acgnox * ((ppress(k)-ppress(k+1))/dpcg) - END DO - END IF - - ! ...then cloud-to-cloud L-NOx profiles (kg(N)/gridcell/s) - IF (ppress(jniv) <= ppress(klt)) THEN - anox(klt-1) = anox(klt-1) + accnox - ELSE - DO k = jniv,klt-1 - anox(k) = accnox * ((ppress(k)-ppress(k+1))/dpcc) - END DO - END IF END IF IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle)
The aim of this change is to allow the code to either redistribute lightning NOx emissions vertically either linearly in pressure (the current default) or linearly in LOG(pressure) (the new change).
Take a look through this code. Can you spot any issues that you think it might have?.
Run rose-stem
You should now run this through rose-stem by running the command
rose stem --group=vm_n48_ukca_eg_noomp,umdp3_check
The vm_n48_ukca_eg_noomp
will run the code through one of the UKCA jobs, and the umdp3_check
will test for coding standard compliance.
Rose-stem will fail. How does it fail? What are the error messages? What can you do to fix them?
umdp3_check
The error message (in the job.out file) is:
The following files have failed the UMDP3 compliance tests: File src/atmosphere/UKCA/ukca_light.F90 : Line longer than 80 characters: ' anox(k) = anox(k) + accnox * ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) '
This is relatively easy to solve by adding a continuation line.
Index: src/atmosphere/UKCA/ukca_light.F90 =================================================================== --- src/atmosphere/UKCA/ukca_light.F90 (revision 47427) +++ src/atmosphere/UKCA/ukca_light.F90 (revision 47436) @@ -268,7 +268,8 @@ ! jniv is greater than the cloud-top-height ! Note: anox(k) is also on the RHS of this equation DO k = jniv,klt-1 - anox(k) = anox(k) + accnox * ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) + anox(k) = anox(k) + accnox * & + ( (LOG(ppress(k)) - LOG(ppress(k+1))) / dpcc ) END DO END IF ELSE ! .not. l_ukca_linox_logp
See https://code.metoffice.gov.uk/trac/um/changeset/47436
If you make this change and then fcm commit
you can then re-run the umdp3_check
task again.
rose stem --group=umdp3_check
You should find that it passes successfully.
fcm_make_vm_gnu_um_safe_noomp
The error is (in the job.err fail) is:
[FAIL] /home/vagrant/cylc-run/vn10.9_UKCA_Worked_Example/share/fcm_make_vm_gnu_um_safe_noomp/preprocess-atmos/src/um/src/atmosphere/UKCA/ukca_light.F90:257:23: [FAIL] [FAIL] IF (l_ukca_linox_logp) THEN [FAIL] 1 [FAIL] Error: Symbol ‘l_ukca_linox_logp’ at (1) has no IMPLICIT type [FAIL] compile 0.2 ! ukca_light_mod.o <- um/src/atmosphere/UKCA/ukca_light.F90 [FAIL] ! ukca_light_mod.mod : depends on failed target: ukca_light_mod.o [FAIL] ! ukca_light_mod.o : update task failed
UKCA Chemistry and Aerosol Tutorials at vn10.9
Written by Luke Abraham 2017