File:Ccsm4 lgm usa precipitation annual 1.svg
Size of this PNG preview of this SVG file: 776 × 600 pixels. Other resolutions: 311 × 240 pixels | 621 × 480 pixels | 994 × 768 pixels | 1,280 × 989 pixels | 2,560 × 1,978 pixels | 1,056 × 816 pixels.
Original file (SVG file, nominally 1,056 × 816 pixels, file size: 1.49 MB)
File information
Structured data
Captions
Summary edit
DescriptionCcsm4 lgm usa precipitation annual 1.svg |
English: Annual precipitation , USA , Last Glacial Maximum. Last Glacial Maximum CCSM4 downscaled to 2.5 min resolution with ANUSPLIN Visualization with NASA Panoply, Output is converted with pdf2svg and optimized with svgo. Data is processed with GDAL and CDO for visuialization |
Date | |
Source |
Own work Source of data is WorldClim 1.4 LGM data http://www.worldclim.org/paleo-climate1 http://biogeo.ucdavis.edu/data/climate/cmip5/lgm/cclgmbi_2-5m.zip Hijmans, R.J., S.E. Cameron, J.L. Parra, P.G. Jones and A. Jarvis, 2005. Very high resolution interpolated climate surfaces for global land areas. International Journal of Climatology 25: 1965-1978. |
Author | Merikanto |
This SVG image contains embedded raster graphics.[1] Such images are liable to produce inferior results when scaled to different sizes (as well as possibly being very inefficient in file size). If appropriate to do so, they should be replaced with images created using vector graphics. Note: This template is only supposed to be used if the SVG file mixes vector and raster graphics. If the SVG file only contains raster graphics {{FakeSVG}} is supposed to be used. See also {{TopoSVG}}. |
Processing scripts under Debian/Ubuntu/Mint:
## get LGM climate data geotiff from http://www.worldclim.org/paleo-climate1
mkdir data
cd data
wget http://biogeo.ucdavis.edu/data/climate/cmip5/lgm/cclgmtn_2-5m.zip
wget http://biogeo.ucdavis.edu/data/climate/cmip5/lgm/cclgmtx_2-5m.zip
wget http://biogeo.ucdavis.edu/data/climate/cmip5/lgm/cclgmpr_2-5m.zip
wget http://biogeo.ucdavis.edu/data/climate/cmip5/lgm/cclgmbi_2-5m.zip
unzip cclgmtn_2-5m.zip
unzip cclgmtx_2-5m.zip
unzip cclgmpr_2-5m.zip
unzip cclgmbi_2-5m.zip
rm *.zip
cd ..
mkdir plot
mkdir teksti
## init mapping utilzzz
sudo apt-get install gdal-bin python-gdal nco cdo ctioga2 libnetcdf libnetcdf-dev -y
## sumenna.bash
#sudo apt install saga
gcc -o ncblit1 ncblit1.c -lm -lnetcdf
gcc -o ncprobe1 ncprobe1.c -lm -lnetcdf
sorckanta1="cclgmtn"
sorckanta2="cclgmtx"
sorckanta3="cclgmpr"
sorckanta4="cclgmtk"
psorckanta1="cclgmbi"
cd data
for i in {1..12..1}
do
sorcnimi1=$sorckanta1$i.tif
sorcnimi2=$sorckanta2$i.tif
sorcnimi3=$sorckanta3$i.tif
sorcnimi4=$sorckanta4$i.tif
nesorcnimi1=$sorckanta1$i.nc
nesorcnimi2=$sorckanta2$i.nc
nesorcnimi3=$sorckanta3$i.nc
nesorcnimi4=$sorckanta4$i.nc
gdal_calc.py -A $sorcnimi1 -B $sorcnimi2 --outfile=$sorcnimi4 --calc="(A+B)/20"
gdal_translate -ot Float32 -of netCDF $sorcnimi1 $nesorcnimi1
gdal_translate -ot Float32 -of netCDF $sorcnimi2 $nesorcnimi2
gdal_translate -ot Float32 -of netCDF $sorcnimi3 $nesorcnimi3
gdal_translate -ot Float32 -of netCDF $sorcnimi4 $nesorcnimi4
done
for i in {1..15..1}
do
psorcnimi1=$psorckanta1$i.tif
pesorcnimi1=$psorckanta1$i.nc
gdal_calc.py -A $psorcnimi1 --outfile=temp.tif --calc="A"
gdal_translate -ot Float32 -of netCDF temp.tif $pesorcnimi1
done
cd ..
Not necessary with NASA Panoply:
ay="40"
ax="160"
by="80"
bx="220"
koords=$ay":"$ax":"$by":"$bx
inufold="./data/"
outtafold="./data/"
simulat="cclgm"
sorckanta1=$simulat"tn"
sorckanta2=$simulat"tx"
sorckanta3=$simulat"pr"
sorckanta4=$simulat"tk"
psorckanta1=$simulat"bi"
outtabase="beringia_"
for i in {1..12..1}
do
iname1=$inufold$sorckanta4$i".nc"
iname2=$inufold$sorckanta3$i".nc"
oname1=$outtafold$outtabase$sorckanta4$i".nc"
oname2=$outtafold$outtabase$sorckanta3$i".nc"
echo $iname1" "$oname1
# echo $koords
./ncblit1 -i $iname1 -o temp1.nc -k $koords
./ncblit1 -i $iname2 -o temp2.nc -k $koords
cdo setmissval,-32767 temp1.nc $oname1
cdo setmissval,-32767 temp2.nc $oname2
done
for i in {1..15..1}
do
iname1=$inufold$psorckanta1$i".nc"
oname1=$outtafold$outtabase$psorckanta1$i".nc"
echo $iname1
echo $oname1
./ncblit1 -i $iname1 -o temp.nc -k $koords
cdo setmissval,-32767 temp.nc $oname1
done
And cprogs ncblit:
// ncblit1.c
// takes subset window of single input netcdf file
// and saves it output netcdf file
// netcdf4 .nc version 4
// ubuntu, mint ...
// sudo apt install build-essential
//sudo apt-get install libnetcdf-dev
// gcc -o ncblit1 ncblit1.c -lm -lnetcdf
// 2d grid 96x48 grid lon,lat,TS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <netcdf.h>
#define NDIMS 2
//#define NLAT 48
//#define NLON 96
#define NLAT 3600
#define NLON 8640
#define UNITS "units"
#define DEGREES_EAST "degrees_east"
#define DEGREES_NORTH "degrees_north"
#define ERR(e) {printf("Error: %s\n", nc_strerror(e)); return 2;}
char iname[1024]="in.nc";
char oname[1024]="out.nc";
char lat_name1[1024]= "lat";
char lon_name1[1024]= "lon";
char z_name1[1024]= "Band1";
char z_units1[] = "units";
char lat_name2[1024]= "lat";
char lon_name2[1024]= "lon";
char z_name2[1024]= "Band1";
char z_units2[] = "units";
int nlat1=NLAT;
int nlon1=NLON;
int nlat2=NLAT;
int nlon2=NLON;
double anax=0.0;
double anay=0.0;
double anlx=45.0;
double anly=45.0;
char bufu[1024];
//float *lats2=NULL;
float *lats2=NULL;
float *lats1=NULL;
float *lons1=NULL;
float *lons2=NULL;
float *z1=NULL;
float *z2=NULL;
int ncwrite1(char *outfiili)
{
int ncid, lon_dimid, lat_dimid, pres_varid, z_varid;
int lat_varid, lon_varid;
int dimids[NDIMS];
int retval;
if ((retval = nc_create(outfiili, NC_CLOBBER, &ncid)))
ERR(retval);
if ((retval = nc_def_dim(ncid, lat_name2, nlat2, &lat_dimid)))
ERR(retval);
if ((retval = nc_def_dim(ncid, lon_name2, nlon2, &lon_dimid)))
ERR(retval);
if ((retval = nc_def_var(ncid, lat_name2, NC_FLOAT, 1, &lat_dimid,
&lat_varid)))
ERR(retval);
if ((retval = nc_def_var(ncid, lon_name2, NC_FLOAT, 1, &lon_dimid,
&lon_varid)))
ERR(retval);
if ((retval = nc_put_att_text(ncid, lat_varid, UNITS,
strlen(DEGREES_NORTH), DEGREES_NORTH)))
ERR(retval);
if ((retval = nc_put_att_text(ncid, lon_varid, UNITS,
strlen(DEGREES_EAST), DEGREES_EAST)))
ERR(retval);
dimids[0] = lat_dimid;
dimids[1] = lon_dimid;
if ((retval = nc_def_var(ncid, z_name2, NC_FLOAT, NDIMS,
dimids, &z_varid)))
ERR(retval);
if ((retval = nc_put_att_text(ncid, z_varid, UNITS,
strlen(z_units2), z_units2)))
ERR(retval);
if ((retval = nc_enddef(ncid)))
ERR(retval);
// printf("\n nlat2 %i %f %f",nlat2, lats2[0], lats2[1]);
// printf("\n nlon2 %i %f %f",nlon2, lons2[0],lons2[1] );
// printf("\n z2 %f %f ", z2[0],z2[1]);
if ((retval = nc_put_var_float(ncid, lat_varid, &lats2[0])))
ERR(retval);
if ((retval = nc_put_var_float(ncid, lon_varid, &lons2[0])))
ERR(retval);
if ((retval = nc_put_var_float(ncid, z_varid, &z2[0])))
ERR(retval);
if ((retval = nc_close(ncid)))
ERR(retval);
return 0;
}
int ncread3(char *infiili)
{
int ncid, pres_varid, temp_varid;
int lat_varid, lon_varid;
int ndims_in, nvars_in, ngatts_in, unlimdimid_in;
int retval;
if ((retval = nc_open(infiili, NC_NOWRITE, &ncid)))
{
printf("\n %s :", infiili);
ERR(retval);
}
if ((retval = nc_inq_varid(ncid, lat_name1, &lat_varid)))
ERR(retval);
if ((retval = nc_inq_varid(ncid, lon_name1, &lon_varid)))
ERR(retval);
if ((retval = nc_get_var_float(ncid, lat_varid, lats1)))
ERR(retval);
if ((retval = nc_get_var_float(ncid, lon_varid, lons1)))
ERR(retval);
if ((retval = nc_inq_varid(ncid, z_name1, &temp_varid)))
ERR(retval);
if ((retval = nc_get_var_float(ncid, temp_varid, z1)))
ERR(retval);
if ((retval = nc_close(ncid)))
ERR(retval);
return 0;
}
int initdata1(int nx, int ny)
{
//freedata();
z1=malloc(nx*ny*sizeof(float));
if(z1)
{
memset(z1,0, nx*ny*sizeof(float) ) ;
}
lons1=malloc(nlon1*sizeof(float));
if(lons1)
{
memset(lons1,0, nlon1*sizeof(float) ) ;
}
lats1=malloc( nlat1*sizeof(float) );
if(lats1)
{
memset( lats1,0, nlat1*sizeof(float) ) ;
}
return(0);
}
int initdata2(int nx, int ny)
{
//freedata();
z2=malloc(nx*ny*sizeof(float));
if(z2)
{
memset(z2,0, nx*ny*sizeof(float) ) ;
}
lons2=malloc(nlon2*sizeof(float));
if(lons2)
{
memset(lons2,0, nlon2*sizeof(float) ) ;
}
lats2=malloc( nlat2*sizeof(float) );
if(lats2)
{
memset( lats2,0, nlat2*sizeof(float) ) ;
}
return(0);
}
void freedata()
{
if(z1)
{
free(z1);
z1=NULL;
}
if(lons1)
{
free(lons1);
lons1=NULL;
}
if(lats1)
{
free(lats1);
lats1=NULL;
}
if(z2)
{
free(z2);
z2=NULL;
}
if(lons2)
{
free(lons2);
lons2=NULL;
}
/*
if(lats2)
{
free(lats2);
lats2=NULL;
}
*/
}
int copykuva(void)
{
int lat, lon;
double lata, longa=0.0;
double dylat, dxlon=0.0;
/*
lata=-90.0;
longa=-180.0;
dylat=180.0/nlat1;
dxlon=360.0/nlon1;
for (lat = 0; lat < nlat; lat++)
lats[lat] = lata + dylat*lat;
for (lon = 0; lon < nlon; lon++)
lons[lon] = longa + dxlon*lon;
*/
for (lat = 0; lat < nlat1; lat++)
{
lats2[lat]=lats1[lat];
}
for (lon = 0; lon < nlon1; lon++)
{
lons2[lon]=lons1[lon];
}
for (lat = 0; lat < nlat1; lat++)
for (lon = 0; lon < nlon1; lon++)
{
z2[lat*nlon1+lon]= z1[lat*nlon1+lon];
}
}
int nearest_lon(double longa)
{
int indexi=-1;
int lon=0;
for (lon = 0; lon < nlon1; lon++)
{
indexi=lon;
if(longa>=lons1[lon])
{
if(longa<=lons1[lon+1])
{
return(indexi);
}
}
}
return(-1);
}
int nearest_lat(double lata)
{
int indexi=-1;
int lat=0;
for (lat = 0; lat < nlat1; lat++)
{
if(lata>=lats1[lat])
{
if(lata<=lats1[lat+1])
{
indexi=lat;
return(indexi);
}
}
}
return(-1);
}
int printlonlat(void)
{
int lat, lon=0;
/*
for (lat = 0; lat < nlat2; lat++)
{
printf(" %f ", lats2[lat]);
}
*/
for (lon = 0; lon < nlon2; lon++)
{
printf(" %f ", lons2[lon]);
}
/*
for (lat = 0; lat < nlat2; lat++)
{
printf("\n");
for (lon = 0; lon < nlon2; lon++)
{
printf("%f ", z2[lat*nlat2+lon]);
}
}
*/
return(0);
}
int latideksi(double neula)
{
int n=0, deksi=0;
deksi=-1;
for(n=0;n<nlat1; n++)
{
if (lats1[n]>=neula)
{
deksi=n;
break;
}
}
return deksi;
}
int lonideksi(double neula)
{
int n=0, deksi=0;
deksi=-1;
for(n=0;n<nlon1; n++)
{
if (lons1[n]>=neula)
{
deksi=n;
break;
}
}
return deksi;
}
int nc_blit(double lata, double lona, double latb, double lonb)
{
int srcax, srcay, srcbx, srcby=0;
int srcmx, srcmy=0;
int srccx, srccy;
int srcnx, srcny=0;
// int ofx,ofy=0;
int lat, lon=0;
double dstdlat, dstdlon;
int liputus=0;
double lonc=0.0;
long dexal=0;
// worldclim rect
// -180 ... 180, +90 - -60
// ofx=0;
// ofy=0;
liputus=0;
// if(lona<180.0)
// {
if(lonb>=180.0)
{
liputus=1;
lonc=360-lonb;
lonb=lons1[lonideksi(179.97)-1];
// lonb=lons1[nlon1];
// printf("\n LONA LONB %f %f %f\n",lona,lonb, lonc);
}
// }
// exit(-1);
// jn test break;
srcax=lonideksi(lona);
srcay=latideksi(lata);
srcbx=lonideksi(lonb);
srcby=latideksi(latb);
srccx=lonideksi(lonc);
srccy=latideksi(latb);
srcmx=abs(srcbx-srcax);
srcmy=abs(srcby-srcay);
srcnx=abs(srccx-srcbx);
srcny=abs(srccy-srcby);
dstdlat=fabs(latb-lata)/srcmy;
dstdlon=fabs(lonb-lona)/srcmx;
// printf("\n dlat dlon %f %f \n ",dstdlat, dstdlon);
nlon2=srcmx;
if(liputus==1)
{
nlon2=srcmx+srcnx;
}
nlat2=srcmy;
// printf("\n SRC %i %i %i",srcax, srcbx, srccx);
// printf("\n MNX %i %i %i",srcmx, srcnx, nlon2);
if(z2) free(z2);
z2=malloc(nlon2*nlat2*sizeof(float));
if(z2)
{
memset(z2,0, nlon2*nlat2*sizeof(float) ) ;
}
if(lons2) free(lons2);
lons2=malloc(nlon2*sizeof(float));
if(lons2)
{
memset(lons2,0, nlon2*sizeof(float) ) ;
}
if(lats2) free(lats2);
lats2=malloc(nlat2*sizeof(float));
if(lats2)
{
memset(lats2,0, nlat2*sizeof(float) ) ;
}
/*
for (lat = 0; lat < nlat2; lat++)
lats2[lat] = lata + dstdlat*lat;
for (lon = 0; lon < nlon2; lon++)
lons2[lon] = lona + dstdlon*lon;
*/
for (lat = 0; lat < nlat2; lat++)
{
lats2[lat]=lats1[srcay+lat];
}
/*
for (lon = 0; lon < nlon2; lon++)
{
lons2[lon]=lons1[srcax+lon];
}
*/
for (lon = 0; lon < srcmx; lon++)
{
lons2[lon]=lons1[srcax+lon];
}
if(liputus==1)
{
for (lon = 0; lon < srcnx; lon++)
{
lons2[lon+srcmx]=lons1[lon];
}
}
for (lat = 0; lat < nlat2; lat++)
{
for (lon = 0; lon < nlon2; lon++)
{
dexal=(srcay+lat)*nlon1+srcax+lon;
z2[lat*nlon2+lon]= z1[dexal];
}
}
/*
if(liputus==1)
{
for (lat = 0; lat < nlat2; lat++)
{
for (lon = 0; lon < nlon2; lon++)
{
dexal=(srcay+lat)*nlon1+srcbx+lon;
z2[lat*nlon2+lon]= z1[dexal];
}
}
}
*/
}
void mutatekoords(void)
{
// process koords for netcdf data cutter
// c
// anlx > 180 or
if(anlx<0)
{
if(anax>0)
{
anlx=360+anlx;
}
}
}
int processkoords(char* instringi)
{
char *p, *q=NULL;
int lena, n, m=0;
/*
double anax=0.0;
double anay=0.0;
double anlx=45.0;
double anly=45.0;
*/
memset(bufu,0,1024);
strcpy(bufu,instringi);
p=bufu;
q=bufu;
strcat(bufu, ":");
lena=strlen(bufu);
// printf("\n %s", bufu);
for(n=0;n<4;n++)
{
q=strchr(p,':');
*q=0;
if (n==0) anay=atof(p);
if (n==1) anax=atof(p);
if (n==2) anly=atof(p);
if (n==3) anlx=atof(p);
p=q+1;
}
// printf("\n KOORDS %f %f %f %f",anay,anax,anly, anlx);
return(0);
}
int init_data0(void)
{
anax=0.0;
anay=0.0;
anlx=45.0;
anly=45.0;
nlon1=8640;
nlat1=3600;
nlon2=8640;
nlat2=3600;
memset(z_name1,0,1024);
strcpy(z_name1,"Band1");
return(0);
}
int init_data1(void)
{
initdata1(nlon1, nlat1);
nlon2=nlon1;
nlat2=nlat1;
initdata2(nlon2,nlat2);
return(0);
}
void avuste(void)
{
printf("\n ncblit1 creates areea .nc file (spatial subset or winndow ) of single .nc file");
printf("\n Inputfile is netcdf data file, format 2D lon, lat, Band1 Float32");
printf("\n coordinates form of file is (lon, lat) decimal degrees -180.0 .. 180.0, -90.0 ... 90.0 ");
printf("\n usage tex. ncblit1 -i in.nc -o out.nc -k 10.00:20.00:80.00:120.00");
printf("\n-i inputfile (.nc netcdf Float32 file)");
printf("\n-o outputfile (.nc netcdf Float32 file) ");
printf("\n-b band name, default is Band1 ");
printf("\n-wi nc file width, default is 8640 ");
printf("\n-he nc file width, default is 3600 ");
printf("\n -h ( or --help, this help screen");
}
int parsi_argut(int argc, char **argv)
{
int n=0;
if(argc>1)
{
for(n=0;n<argc;n++)
{
if( !strcmp(argv[n],"-h") )
{
avuste();
exit(0);
}
if( !strcmp(argv[n],"--help") )
{
avuste();
exit(0);
}
if( !strcmp(argv[n],"-i") )
{
if(argv[n+1])
{
strcpy(iname, argv[n+1]);
}
}
if( !strcmp(argv[n],"-o") )
{
if(argv[n+1])
{
strcpy(oname, argv[n+1]);
}
}
if( !strcmp(argv[n],"-b") )
{
if(argv[n+1])
{
strcpy(z_name1, argv[n+1]);
strcpy(z_name2, argv[n+1]);
}
}
if( !strcmp(argv[n],"-wi") )
{
if(argv[n+1])
{
nlon1=atof(argv[n+1]);
}
}
if( !strcmp(argv[n],"-he") )
{
if(argv[n+1])
{
nlat1=atof(argv[n+1]);
}
}
if( !strcmp(argv[n],"-k") )
{
if(argv[n+1])
{
processkoords(argv[n+1]);
}
}
}
}
return(0);
}
int main(int argc, char **argv)
{
init_data0();
// processkoords("1.0:1.0:45.0:60.0");
// processkoords("40:160.0:80.0:-160");
// processkoords("40:-140.0:80.0:-100");
// mutatekoords();
parsi_argut(argc, argv);
mutatekoords();
init_data1();
// printf("\n ncread ...");
ncread3(iname);
// printf("\n ncread ");
nc_blit(anay,anax,anly,anlx);
// printf("\n %s", oname);
ncwrite1(oname);
freedata();
printf("\n");
return(0);
}
for filei in *.pdf
do
#echo $filee
filename="${filei%.*}"
fileo=$filename".svg"
echo $filei, $fileo
pdf2svg $filei $fileo
svgo $fileo
done
Licensing edit
I, the copyright holder of this work, hereby publish it under the following license:
This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.
- You are free:
- to share – to copy, distribute and transmit the work
- to remix – to adapt the work
- Under the following conditions:
- attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Thumbnail | Dimensions | User | Comment | |
---|---|---|---|---|---|
current | 19:13, 3 December 2018 | 1,056 × 816 (1.49 MB) | Merikanto (talk | contribs) | User created page with UploadWizard |
You cannot overwrite this file.
File usage on Commons
The following 3 pages use this file:
Metadata
This file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.
Width | 1056 |
---|---|
Height | 816 |