ndp017_convert.txt In 2000, CDIAC reformatted and enhanced the data file for NDP-017 (without changing any of the underlying data values). In the first step, a FORTRAN program was written (derived from the FORTRAN program in the original numeric data package) to convert the matrix file to a simpler, but larger, flat file in which each line of the data file would consist of ecosystem name and corresponding ecosystem code values for a specific latitude-longitude grid cell. In the second step, a SAS program was written to calculate the area of each gridcell and append that area to the data for each gridcell. Finally, a SAS program was written to append medium, revised medium, minimum, and maximum estimates of carbon density to the data for each grid cell. The FORTRAN and SAS codes used are included below. FORTRAN code to convert original matrix data file: -------------------------------------------------- C *** Fortran code for converting the original NDP-017 matrix data file C *** (with explicit grid cell numbers) to a file giving C *** latitude, longitude, ecosystem code, and ecosystem complex for all C *** the 360X720, 1/2 by 1/2 degree grid cells over the globe. C CHARACTER*16 VTYP(720),VN(47) INTEGER SURF,SYM DIMENSION SURF(200,2),SYM(720) DIMENSION XF(720),YF(720),ISYM(720) OPEN (UNIT=2, FILE='ndp017.dat', 2 ACCESS='SEQUENTIAL', FORM='FORMATTED', STATUS='OLD') open (unit=6, file='ndp017_grid.dat') DATA VN/'ANTARCTICA ','MAIN TAIGA ', 1 'COOL CONIFER ','COOL MIXED ','WARM DECIDUOUS ', 2 'WARM MIXED ','WARM CONIFER ','TROPICAL MONTANE', 3 'TROP. SEASONAL ','EQ. EVERGREEN ','COOL CROPS ', 4 'WARM CROPS ','TROPICAL DRY FOR','PADDYLANDS ', 5 'WARM IRRIGATED ','COOL IRRIGATED ','COLD IRRIGATED ', 6 'COOL GRASS/SHRUB','WARM GRASS/SHRUB','HIGHLAND SHRUB ', 7 'MED. GRAZING ','SEMIARID WOODS ','SIBERIAN PARKS ', 8 'HEATHS, MOORS ','SUCCULENT THORNS','NORTH. TAIGA ', 9 'TROP. SAVANNA ','COOL FIELD/WOODS','WARM FIELD WOODS', 1 'WARM FOR./FIELD ','COOL FOR./FIELD ','SOUTH. TAIGA ', 2 'E. SOUTH. TAIGA ','TROP. MONTANE ','MARSH, SWAMP ', 3 'MANGROVES ','LOW SCRUB ','BOGS, BOG WOODS ', 4 'HOT DESERT ','COOL DESERT ','WOODED TUNDRA ', 5 'TUNDRA ','SAND DESERT ','POLAR DESERT ', 6 'ICE ','WATER ', 7 'COASTAL EDGES '/ C STARTING LATITUDE AND LONGITUDE POINTS CENTERED ON CELL DO 55 ILO=1,720 55 XF(ILO)=-179.75+(0.5*(ILO-1)) C READ IN DATA FOR EACH 0.5 DEGREE LATITUDE BAND C NP=NO. OF PAIRS OF POINTS AND VEGETATION CODE C SURF(IP,1) IS NO. OF CONSECUTIVE CELLS HAVING VEGETATION TYPE C DEFINED IN SURF(I,2) C SURF(I,2) IS VEGETATION CODE DO 1 IROW=1,360 YLAT=89.75-(0.5*(IROW-1)) READ(2,8001) NP,(SURF(IP,1),SURF(IP,2),IP=1,15) IF(NP .LE. 15) GO TO 30 10 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=16,30) IF(NP .LE. 30) GO TO 30 11 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=31,45) IF(NP .LE. 45) GO TO 30 12 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=46,60) IF(NP .LE. 60) GO TO 30 13 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=61,75) IF(NP .LE. 75) GO TO 30 14 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=76,90) IF(NP .LE. 90) GO TO 30 15 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=91,105) IF(NP .LE. 105) GO TO 30 16 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=106,120) IF(NP .LE. 120) GO TO 30 17 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=121,135) IF(NP .LE. 135) GO TO 30 18 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=136,150) IF(NP .LE. 150) GO TO 30 19 READ(2,8002) (SURF(IP,1),SURF(IP,2),IP=151,165) 8001 FORMAT(I3,15(I3,I2)) 8002 FORMAT(3X,15(I3,I2)) 30 CONTINUE C SET UP COUNTERS TO LOOP THRU TO DEFINE ECOSYSTEM COMPLEX C FOR EACH CELL ON A LAT-LONG BASIS C LOOP FOR NP PAIRS IK=0 IC=1 DO 2 I=1,NP I2=SURF(I,2) I1=SURF(I,1) IK=IC+I1-1 DO 3 J=IC,IK SYM(J)=I2 3 CONTINUE IC=IC+I1 2 CONTINUE DO 5 IKT=1,720 YF(IKT)=YLAT ISYM(IKT)=SYM(IKT) IF(ISYM(IKT) .EQ. 0) VTYP(IKT)=VN(46) IF(ISYM(IKT).EQ. 17) VTYP(IKT)=VN(1) IF(ISYM(IKT).EQ.20 .OR. ISYM(IKT) .EQ. 21) 1 VTYP(IKT)=VN(2) IF(ISYM(IKT) .EQ. 22) VTYP(IKT)=VN(3) IF(ISYM(IKT) .EQ. 23) VTYP(IKT)=VN(4) IF(ISYM(IKT) .EQ. 24) VTYP(IKT)=VN(5) IF(ISYM(IKT) .EQ. 25 .OR. ISYM(IKT) .EQ. 26) 1 VTYP(IKT)=VN(6) IF(ISYM(IKT) .EQ. 27) VTYP(IKT)=VN(7) IF(ISYM(IKT) .EQ. 28) VTYP(IKT)=VN(8) IF(ISYM(IKT) .EQ. 29) VTYP(IKT)=VN(9) IF(ISYM(IKT) .EQ. 33) VTYP(IKT)=VN(10) IF(ISYM(IKT) .EQ. 30) VTYP(IKT)=VN(11) IF(ISYM(IKT) .EQ. 31) VTYP(IKT)=VN(12) IF(ISYM(IKT) .EQ. 32) VTYP(IKT)=VN(13) IF(ISYM(IKT) .EQ. 36) VTYP(IKT)=VN(14) IF(ISYM(IKT) .EQ. 37) VTYP(IKT)=VN(15) IF(ISYM(IKT) .EQ. 38) VTYP(IKT)=VN(16) IF(ISYM(IKT) .EQ. 39) VTYP(IKT)=VN(17) IF(ISYM(IKT) .EQ. 40) VTYP(IKT)=VN(18) IF(ISYM(IKT) .EQ. 41) VTYP(IKT)=VN(19) IF(ISYM(IKT) .EQ. 47) VTYP(IKT)=VN(20) IF(ISYM(IKT) .EQ. 46) VTYP(IKT)=VN(21) IF(ISYM(IKT) .EQ. 48) VTYP(IKT)=VN(22) IF(ISYM(IKT) .EQ. 42) VTYP(IKT)=VN(23) IF(ISYM(IKT) .EQ. 64) VTYP(IKT)=VN(24) IF(ISYM(IKT) .EQ. 59) VTYP(IKT)=VN(25) IF(ISYM(IKT) .EQ. 62) VTYP(IKT)=VN(26) IF(ISYM(IKT) .EQ. 43) VTYP(IKT)=VN(27) IF(ISYM(IKT) .EQ. 55) VTYP(IKT)=VN(28) IF(ISYM(IKT) .EQ. 58) VTYP(IKT)=VN(29) IF(ISYM(IKT) .EQ. 56) VTYP(IKT)=VN(30) IF(ISYM(IKT) .EQ. 57) VTYP(IKT)=VN(31) IF(ISYM(IKT) .EQ. 60) VTYP(IKT)=VN(32) IF(ISYM(IKT) .EQ. 61) VTYP(IKT)=VN(33) IF(ISYM(IKT) .EQ. 28) VTYP(IKT)=VN(34) IF(ISYM(IKT) .EQ. 45) VTYP(IKT)=VN(35) IF(ISYM(IKT) .EQ. 72) VTYP(IKT)=VN(36) IF(ISYM(IKT) .EQ. 49) VTYP(IKT)=VN(37) IF(ISYM(IKT) .EQ. 44) VTYP(IKT)=VN(38) IF(ISYM(IKT) .EQ. 51 .OR. SYM(IKT) .EQ. 71) 1 VTYP(IKT)=VN(39) IF(ISYM(IKT) .EQ. 52) VTYP(IKT)=VN(40) IF(ISYM(IKT) .EQ. 63) VTYP(IKT)=VN(41) IF(ISYM(IKT) .EQ. 53 .OR. ISYM(IKT) .EQ. 54) 1 VTYP(IKT)=VN(42) IF(ISYM(IKT) .EQ. 50) VTYP(IKT)=VN(43) IF(ISYM(IKT) .EQ. 69) VTYP(IKT)=VN(44) IF(ISYM(IKT) .EQ. 70) VTYP(IKT)=VN(45) IF(ISYM(IKT) .GE. 65 .AND. 1 ISYM(IKT) .LE. 68) VTYP(IKT)=VN(47) 5 CONTINUE C************************ DO 150 NCT=1,720 WRITE(6,230) YF(NCT),XF(NCT),ISYM(NCT),VTYP(NCT) 230 FORMAT(1H ,F8.2,3X,F9.2,9X,I2,8X,A16) 150 CONTINUE 1 CONTINUE CLOSE (UNIT=2) CLOSE (UNIT=6) STOP END SAS code used to calculate gridcell area (in km^2) from latitude (in degrees): ------------------------------------------------------------------------------ area=(abs(sin(radian*(lat_deg+0.5)) -sin(radian*(lat_deg-0.5)))/2) *((1.4186e6)/(4)); SAS routine to read ndp017_g.dat and add carbon density values: --------------------------------------------------------------- filename out 'ndp017_g.dat'; data ndp017; infile '/home/cdp/ndp017/temp/ndp017_g.dat'; input LAT 1-6 LON 7-14 ECOCODE 15-18 ECO $ 20-36 AREA 37-41; if ECOCODE=22 then do; MEDCD = 16.00; RMEDCD= 13.00; MINCD = 12.0; MAXCD = 20.0; end; else if ECOCODE=27 then do; MEDCD = 16.00; RMEDCD= 13.00; MINCD = 12.0; MAXCD = 20.0; end; else if ECOCODE=29 then do; MEDCD = 15.00; RMEDCD= 12.00; MINCD = 4.0; MAXCD = 25.0; end; else if ECOCODE=33 then do; MEDCD = 15.00; RMEDCD= 12.00; MINCD = 4.0; MAXCD = 25.0; end; else if ECOCODE=73 then do; MEDCD = 15.00; RMEDCD= 12.00; MINCD = 4.0; MAXCD = 25.0; end; else if ECOCODE=60 then do; MEDCD = 11.00; RMEDCD= 8.00; MINCD = 6.0; MAXCD = 14.0; end; else if ECOCODE=61 then do; MEDCD = 11.00; RMEDCD= 8.00; MINCD = 6.0; MAXCD = 14.0; end; else if ECOCODE=23 then do; MEDCD = 10.00; RMEDCD= 7.00; MINCD = 6.0; MAXCD = 14.0; end; else if ECOCODE=24 then do; MEDCD = 10.00; RMEDCD= 7.00; MINCD = 6.0; MAXCD = 14.0; end; else if ECOCODE=25 then do; MEDCD = 10.00; RMEDCD= 9.00; MINCD = 8.0; MAXCD = 14.0; end; else if ECOCODE=26 then do; MEDCD = 10.00; RMEDCD= 9.00; MINCD = 8.0; MAXCD = 14.0; end; else if ECOCODE=20 then do; MEDCD = 8.00; RMEDCD= 6.00; MINCD = 4.0; MAXCD = 11.0; end; else if ECOCODE=21 then do; MEDCD = 8.00; RMEDCD= 6.00; MINCD = 4.0; MAXCD = 11.0; end; else if ECOCODE=32 then do; MEDCD = 7.00; RMEDCD= 6.00; MINCD = 5.0; MAXCD = 9.0; end; else if ECOCODE=56 then do; MEDCD = 5.00; RMEDCD= 4.00; MINCD = 4.0; MAXCD = 8.0; end; else if ECOCODE=57 then do; MEDCD = 5.00; RMEDCD= 4.00; MINCD = 4.0; MAXCD = 8.0; end; else if ECOCODE=48 then do; MEDCD = 5.00; RMEDCD= 4.00; MINCD = 2.0; MAXCD = 10.0; end; else if ECOCODE=62 then do; MEDCD = 5.00; RMEDCD= 5.00; MINCD = 2.0; MAXCD = 8.0; end; else if ECOCODE=28 then do; MEDCD = 5.00; RMEDCD= 5.00; MINCD = 1.0; MAXCD = 15.0; end; else if ECOCODE=55 then do; MEDCD = 4.00; RMEDCD= 3.00; MINCD = 2.0; MAXCD = 5.0; end; else if ECOCODE=58 then do; MEDCD = 4.00; RMEDCD= 3.00; MINCD = 2.0; MAXCD = 5.0; end; else if ECOCODE=59 then do; MEDCD = 4.00; RMEDCD= 3.00; MINCD = 2.0; MAXCD = 6.0; end; else if ECOCODE=46 then do; MEDCD = 4.00; RMEDCD= 3.00; MINCD = 2.0; MAXCD = 8.0; end; else if ECOCODE=47 then do; MEDCD = 4.00; RMEDCD= 3.00; MINCD = 2.0; MAXCD = 8.0; end; else if ECOCODE=45 then do; MEDCD = 3.00; RMEDCD= 2.00; MINCD = 1.0; MAXCD = 6.0; end; else if ECOCODE=72 then do; MEDCD = 3.00; RMEDCD= 2.00; MINCD = 1.0; MAXCD = 6.0; end; else if ECOCODE=36 then do; MEDCD = 3.00; RMEDCD= 3.00; MINCD = 2.0; MAXCD = 4.0; end; else if ECOCODE=43 then do; MEDCD = 3.00; RMEDCD= 3.00; MINCD = 2.0; MAXCD = 5.0; end; else if ECOCODE=65 then do; MEDCD = 3.00; RMEDCD= 3.00; MINCD = 0.0; MAXCD = 10.0; end; else if ECOCODE=66 then do; MEDCD = 3.00; RMEDCD= 3.00; MINCD = 0.0; MAXCD = 10.0; end; else if ECOCODE=67 then do; MEDCD = 3.00; RMEDCD= 3.00; MINCD = 0.0; MAXCD = 10.0; end; else if ECOCODE=68 then do; MEDCD = 3.00; RMEDCD= 3.00; MINCD = 0.0; MAXCD = 10.0; end; else if ECOCODE=37 then do; MEDCD = 2.00; RMEDCD= 2.00; MINCD = 1.0; MAXCD = 3.0; end; else if ECOCODE=38 then do; MEDCD = 2.00; RMEDCD= 2.00; MINCD = 1.0; MAXCD = 3.0; end; else if ECOCODE=39 then do; MEDCD = 2.00; RMEDCD= 2.00; MINCD = 1.0; MAXCD = 3.0; end; else if ECOCODE=63 then do; MEDCD = 2.00; RMEDCD= 2.00; MINCD = 1.0; MAXCD = 5.0; end; else if ECOCODE=44 then do; MEDCD = 2.00; RMEDCD= 2.00; MINCD = 1.0; MAXCD = 6.0; end; else if ECOCODE=64 then do; MEDCD = 1.50; RMEDCD= 1.00; MINCD = 1.0; MAXCD = 2.0; end; else if ECOCODE=41 then do; MEDCD = 1.30; RMEDCD= 0.90; MINCD = 0.5; MAXCD = 3.0; end; else if ECOCODE=30 then do; MEDCD = 1.00; RMEDCD= 0.70; MINCD = 0.4; MAXCD = 2.0; end; else if ECOCODE=31 then do; MEDCD = 1.00; RMEDCD= 0.80; MINCD = 0.6; MAXCD = 2.0; end; else if ECOCODE=40 then do; MEDCD = 1.00; RMEDCD= 0.80; MINCD = 0.6; MAXCD = 2.0; end; else if ECOCODE=42 then do; MEDCD = 1.00; RMEDCD= 1.00; MINCD = 0.5; MAXCD = 4.0; end; else if ECOCODE=52 then do; MEDCD = 0.60; RMEDCD= 0.60; MINCD = 0.3; MAXCD = 1.0; end; else if ECOCODE=53 then do; MEDCD = 0.50; RMEDCD= 0.50; MINCD = 0.0; MAXCD = 1.2; end; else if ECOCODE=54 then do; MEDCD = 0.50; RMEDCD= 0.50; MINCD = 0.0; MAXCD = 1.2; end; else if ECOCODE=69 then do; MEDCD = 0.50; RMEDCD= 0.50; MINCD = 0.0; MAXCD = 1.2; end; else if ECOCODE=70 then do; MEDCD = 0.50; RMEDCD= 0.50; MINCD = 0.0; MAXCD = 1.2; end; else if ECOCODE=51 then do; MEDCD = 0.40; RMEDCD= 0.30; MINCD = 0.2; MAXCD = 1.0; end; else if ECOCODE=71 then do; MEDCD = 0.40; RMEDCD= 0.30; MINCD = 0.2; MAXCD = 1.0; end; else if ECOCODE=49 then do; MEDCD = 0.40; RMEDCD= 0.30; MINCD = 0.2; MAXCD = 1.0; end; else if ECOCODE=50 then do; MEDCD = 0.05; RMEDCD= 0.05; MINCD = 0.0; MAXCD = 0.2; end; else if ECOCODE=0 then do; MEDCD = 0.00; RMEDCD= 0.00; MINCD = 0.0; MAXCD = 0.0; end; else if ECOCODE=17 then do; MEDCD = 0.00; RMEDCD= 0.00; MINCD = 0.0; MAXCD = 0.0; end; file out; put @1 LAT 6.2 @8 LON 7.2 @16 ECOCODE 3. @20 ECO $ @38 AREA @43 MEDCD 5.2 @50 RMEDCD 5.2 @57 MINCD 4.1 @64 MAXCD 4.1 ; run;