version 1.17, 2021/05/24 22:17:58
|
version 1.18, 2021/05/26 04:43:52
|
|
|
#define ARRLENGTH(ARR) (sizeof(ARR) / sizeof(ARR[0])) | #define ARRLENGTH(ARR) (sizeof(ARR) / sizeof(ARR[0])) |
#define DIE(msg) {fflush(stdout); fprintf(stderr,"%s, status=%d\n", msg, status); return(status);} | #define DIE(msg) {fflush(stdout); fprintf(stderr,"%s, status=%d\n", msg, status); return(status);} |
#define SHOW(msg) {printf("%s", msg); fflush(stdout);} | #define SHOW(msg) {printf("%s", msg); fflush(stdout);} |
|
#define DEBUG(true) |
| |
char *module_name = "update_sharp_keys"; /* Module name */ | char *module_name = "update_sharp_keys"; /* Module name */ |
char *version_id = "2020 Jun 29"; /* Version number */ |
char *version_id = "2021 May 25"; /* Version number */ |
| |
ModuleArgs_t module_args[] = | ModuleArgs_t module_args[] = |
{ | { |
|
|
| |
/* Keywords */ | /* Keywords */ |
float mean_vf; | float mean_vf; |
|
float mean_vf_los; |
float absFlux; | float absFlux; |
|
float absFlux_los; |
float count_mask; | float count_mask; |
|
float count_mask_los; |
float mean_hf; | float mean_hf; |
float mean_gamma; | float mean_gamma; |
float mean_derivative_btotal; | float mean_derivative_btotal; |
|
|
char *debug = (char *) params_get_str(&cmdparams, "debug"); | char *debug = (char *) params_get_str(&cmdparams, "debug"); |
| |
// Flags to indicate which keyword will be recalculated | // Flags to indicate which keyword will be recalculated |
int meanvflosflag = (strstr(keylist,"USFLUXLOS") != NULL); |
int meanvflosflag = (strstr(keylist,"USFLUXL") != NULL); |
int meanglosflag = (strstr(keylist,"MEANGBZLOS") != NULL) |
int meanglosflag = (strstr(keylist,"MEANGBL") != NULL); |
int meanvfflag = (strstr(keylist,"USFLUX") != NULL); | int meanvfflag = (strstr(keylist,"USFLUX") != NULL); |
int totpotflag = (strstr(keylist,"TOTPOT") != NULL); | int totpotflag = (strstr(keylist,"TOTPOT") != NULL); |
int meangamflag = (strstr(keylist,"MEANGAM") != NULL); | int meangamflag = (strstr(keylist,"MEANGAM") != NULL); |
|
|
int ny = inseg->axis[1]; | int ny = inseg->axis[1]; |
int nxny = nx * ny; | int nxny = nx * ny; |
int dims[2] = {nx, ny}; | int dims[2] = {nx, ny}; |
|
|
// Temp arrays | // Temp arrays |
float *bh = (float *) (malloc(nxny * sizeof(float))); | float *bh = (float *) (malloc(nxny * sizeof(float))); |
float *bt = (float *) (malloc(nxny * sizeof(float))); | float *bt = (float *) (malloc(nxny * sizeof(float))); |
|
|
float *dery_los = (float *) (malloc(nxny * sizeof(float))); | float *dery_los = (float *) (malloc(nxny * sizeof(float))); |
| |
for (irec=0;irec<nrecs;irec++) | for (irec=0;irec<nrecs;irec++) |
|
//for (irec=5;irec<nrecs;irec++) |
{ | { |
| |
//DRMS_Record_t *sharpinrec = sharpinrecset->records[irec]; | //DRMS_Record_t *sharpinrec = sharpinrecset->records[irec]; |
|
|
dsun_obs = drms_getkey_float(testrec, "DSUN_OBS", &status); | dsun_obs = drms_getkey_float(testrec, "DSUN_OBS", &status); |
rsun_ref = drms_getkey_double(testrec, "RSUN_REF", &status); | rsun_ref = drms_getkey_double(testrec, "RSUN_REF", &status); |
cdelt1_orig = drms_getkey_float(testrec, "CDELT1", &status); | cdelt1_orig = drms_getkey_float(testrec, "CDELT1", &status); |
cdelt1 = (atan((rsun_ref*cdelt1_orig*RADSINDEG)/(dsun_obs)))*(1/RADSINDEG)*(3600.); |
|
int scale = round(2.0/cdelt1); | int scale = round(2.0/cdelt1); |
int nx1 = nx/scale; | int nx1 = nx/scale; |
int ny1 = ny/scale; | int ny1 = ny/scale; |
|
|
DIE("X-dimension of output array in fsample() is too large."); | DIE("X-dimension of output array in fsample() is too large."); |
if (ny1 > floor((ny-1)/scale + 1) ) | if (ny1 > floor((ny-1)/scale + 1) ) |
DIE("Y-dimension of output array in fsample() is too large."); | DIE("Y-dimension of output array in fsample() is too large."); |
|
|
// malloc some arrays for the R parameter calculation | // malloc some arrays for the R parameter calculation |
float *rim = (float *)malloc(nx1*ny1*sizeof(float)); | float *rim = (float *)malloc(nx1*ny1*sizeof(float)); |
float *p1p0 = (float *)malloc(nx1*ny1*sizeof(float)); | float *p1p0 = (float *)malloc(nx1*ny1*sizeof(float)); |
|
|
imcrpix2 = drms_getkey_float(sharpinrec, "IMCRPIX2", &status); | imcrpix2 = drms_getkey_float(sharpinrec, "IMCRPIX2", &status); |
crpix1 = drms_getkey_float(sharpinrec, "CRPIX1", &status); | crpix1 = drms_getkey_float(sharpinrec, "CRPIX1", &status); |
crpix2 = drms_getkey_float(sharpinrec, "CRPIX2", &status); | crpix2 = drms_getkey_float(sharpinrec, "CRPIX2", &status); |
|
cdelt1 = (atan((rsun_ref*cdelt1_orig*RADSINDEG)/(dsun_obs)))*(1/RADSINDEG)*(3600.); |
| |
sharpoutrec = sharpoutrecset->records[irec]; | sharpoutrec = sharpoutrecset->records[irec]; |
sharpceaoutrec = sharpceaoutrecset->records[irec]; | sharpceaoutrec = sharpceaoutrecset->records[irec]; |
|
|
drms_setkey_time(sharpoutrec,"DATE",tnow); | drms_setkey_time(sharpoutrec,"DATE",tnow); |
drms_setkey_time(sharpceaoutrec,"DATE",tnow); | drms_setkey_time(sharpceaoutrec,"DATE",tnow); |
| |
// Get bx, by, bz, mask |
// Get all the segments if computing vector magnetic field keywords |
// Use HARP (Turmon) bitmap as a threshold on spaceweather quantities |
|
DRMS_Segment_t *bitmaskSeg = drms_segment_lookup(sharpceainrec, "bitmap"); | DRMS_Segment_t *bitmaskSeg = drms_segment_lookup(sharpceainrec, "bitmap"); |
DRMS_Array_t *bitmaskArray = drms_segment_read(bitmaskSeg, DRMS_TYPE_INT, &status); | DRMS_Array_t *bitmaskArray = drms_segment_read(bitmaskSeg, DRMS_TYPE_INT, &status); |
int *bitmask = (int *) bitmaskArray->data; // get the previously made mask array | int *bitmask = (int *) bitmaskArray->data; // get the previously made mask array |
| |
//Use conf_disambig map as a threshold on spaceweather quantities |
|
DRMS_Segment_t *maskSeg = drms_segment_lookup(sharpceainrec, "conf_disambig"); | DRMS_Segment_t *maskSeg = drms_segment_lookup(sharpceainrec, "conf_disambig"); |
DRMS_Array_t *maskArray = drms_segment_read(maskSeg, DRMS_TYPE_INT, &status); | DRMS_Array_t *maskArray = drms_segment_read(maskSeg, DRMS_TYPE_INT, &status); |
if (status != DRMS_SUCCESS) | if (status != DRMS_SUCCESS) |
DIE("No CONF_DISAMBIG segment."); | DIE("No CONF_DISAMBIG segment."); |
int *mask = (int *) maskArray->data; // get the previously made mask array | int *mask = (int *) maskArray->data; // get the previously made mask array |
| |
//Use magnetogram map to compute R |
|
DRMS_Segment_t *losSeg = drms_segment_lookup(sharpceainrec, "magnetogram"); | DRMS_Segment_t *losSeg = drms_segment_lookup(sharpceainrec, "magnetogram"); |
DRMS_Array_t *losArray = drms_segment_read(losSeg, DRMS_TYPE_FLOAT, &status); | DRMS_Array_t *losArray = drms_segment_read(losSeg, DRMS_TYPE_FLOAT, &status); |
|
if (status != DRMS_SUCCESS) |
|
DIE("No magnetogram segment."); |
float *los = (float *) losArray->data; // los | float *los = (float *) losArray->data; // los |
|
//printf("Line 387"); |
| |
DRMS_Segment_t *bxSeg = drms_segment_lookup(sharpceainrec, "Bp"); | DRMS_Segment_t *bxSeg = drms_segment_lookup(sharpceainrec, "Bp"); |
DRMS_Array_t *bxArray = drms_segment_read(bxSeg, DRMS_TYPE_FLOAT, &status); | DRMS_Array_t *bxArray = drms_segment_read(bxSeg, DRMS_TYPE_FLOAT, &status); |
|
if (status != DRMS_SUCCESS) |
|
DIE("No Bp segment."); |
float *bx = (float *) bxArray->data; // bx | float *bx = (float *) bxArray->data; // bx |
|
//printf("Line 393"); |
| |
DRMS_Segment_t *bySeg = drms_segment_lookup(sharpceainrec, "Bt"); | DRMS_Segment_t *bySeg = drms_segment_lookup(sharpceainrec, "Bt"); |
DRMS_Array_t *byArray = drms_segment_read(bySeg, DRMS_TYPE_FLOAT, &status); | DRMS_Array_t *byArray = drms_segment_read(bySeg, DRMS_TYPE_FLOAT, &status); |
|
if (status != DRMS_SUCCESS) |
|
DIE("No Bt segment."); |
float *by = (float *) byArray->data; // by | float *by = (float *) byArray->data; // by |
for (int i = 0; i < nxny; i++) by[i] *= -1; | for (int i = 0; i < nxny; i++) by[i] *= -1; |
|
//printf("Line 399"); |
| |
DRMS_Segment_t *bzSeg = drms_segment_lookup(sharpceainrec, "Br"); | DRMS_Segment_t *bzSeg = drms_segment_lookup(sharpceainrec, "Br"); |
|
//printf("Line 408\n"); |
|
if (bzSeg == NULL) |
|
DIE("somekind of pointer problem."); |
|
|
DRMS_Array_t *bzArray = drms_segment_read(bzSeg, DRMS_TYPE_FLOAT, &status); | DRMS_Array_t *bzArray = drms_segment_read(bzSeg, DRMS_TYPE_FLOAT, &status); |
|
//printf("status=%d\n",status); |
|
if (status != DRMS_SUCCESS) |
|
DIE("No Br segment."); |
float *bz = (float *) bzArray->data; // bz | float *bz = (float *) bzArray->data; // bz |
|
//printf("Line 414"); |
| |
DRMS_Segment_t *bz_errSeg = drms_segment_lookup(sharpceainrec, "Br_err"); | DRMS_Segment_t *bz_errSeg = drms_segment_lookup(sharpceainrec, "Br_err"); |
DRMS_Array_t *bz_errArray = drms_segment_read(bz_errSeg, DRMS_TYPE_FLOAT, &status); | DRMS_Array_t *bz_errArray = drms_segment_read(bz_errSeg, DRMS_TYPE_FLOAT, &status); |
|
if (status != DRMS_SUCCESS) |
|
DIE("No Br_err segment."); |
float *bz_err = (float *) bz_errArray->data; // bz_err | float *bz_err = (float *) bz_errArray->data; // bz_err |
|
//printf("Line 408"); |
| |
DRMS_Segment_t *by_errSeg = drms_segment_lookup(sharpceainrec, "Bt_err"); | DRMS_Segment_t *by_errSeg = drms_segment_lookup(sharpceainrec, "Bt_err"); |
DRMS_Array_t *by_errArray = drms_segment_read(by_errSeg, DRMS_TYPE_FLOAT, &status); | DRMS_Array_t *by_errArray = drms_segment_read(by_errSeg, DRMS_TYPE_FLOAT, &status); |
|
if (status != DRMS_SUCCESS) |
|
DIE("No Bt_err segment."); |
float *by_err = (float *) by_errArray->data; // by_err | float *by_err = (float *) by_errArray->data; // by_err |
|
//printf("Line 412"); |
| |
DRMS_Segment_t *bx_errSeg = drms_segment_lookup(sharpceainrec, "Bp_err"); | DRMS_Segment_t *bx_errSeg = drms_segment_lookup(sharpceainrec, "Bp_err"); |
DRMS_Array_t *bx_errArray = drms_segment_read(bx_errSeg, DRMS_TYPE_FLOAT, &status); | DRMS_Array_t *bx_errArray = drms_segment_read(bx_errSeg, DRMS_TYPE_FLOAT, &status); |
|
if (status != DRMS_SUCCESS) |
|
DIE("No Bp_err segment."); |
float *bx_err = (float *) bx_errArray->data; // bx_err | float *bx_err = (float *) bx_errArray->data; // bx_err |
| |
/***** USFLUX, Example Function 1 *************************************/ | /***** USFLUX, Example Function 1 *************************************/ |
|
|
&mean_jz_err, &us_i, &us_i_err, mask, bitmask, cdelt1, | &mean_jz_err, &us_i, &us_i_err, mask, bitmask, cdelt1, |
rsun_ref, rsun_obs, derx, dery)) | rsun_ref, rsun_obs, derx, dery)) |
| |
|
|
{ | { |
mean_jz = DRMS_MISSING_FLOAT; | mean_jz = DRMS_MISSING_FLOAT; |
us_i = DRMS_MISSING_FLOAT; | us_i = DRMS_MISSING_FLOAT; |
|
|
/***** USFLUX, Example Function 17 *************************************/ | /***** USFLUX, Example Function 17 *************************************/ |
if (meanvflosflag) | if (meanvflosflag) |
{ | { |
if (computeAbsFlux_los(los, dims, &(swKeys_ptr->absFlux_los), &(swKeys_ptr->mean_vf_los), |
//printf("772"); |
&(swKeys_ptr->count_mask_los), bitmask, cdelt1, rsun_ref, rsun_obs)) |
if (computeAbsFlux_los(los, dims, &absFlux_los, &mean_vf_los, |
|
&count_mask_los, bitmask, cdelt1, rsun_ref, rsun_obs)) |
{ | { |
absFlux_los = DRMS_MISSING_FLOAT; // If fail, fill in NaN | absFlux_los = DRMS_MISSING_FLOAT; // If fail, fill in NaN |
mean_vf_los = DRMS_MISSING_FLOAT; | mean_vf_los = DRMS_MISSING_FLOAT; |
count_mask_los = DRMS_MISSING_INT; | count_mask_los = DRMS_MISSING_INT; |
} | } |
|
//printf("line757\n"); |
|
//printf("mean_vf_los=%f\n",mean_vf_los); |
|
//printf("cdelt1=%f\n",cdelt1); |
|
//printf("rsun_ref=%f\n",rsun_ref); |
|
//printf("rsun_obs=%f\n",rsun_obs); |
|
//printf("Key #%d done.\n", irec); |
drms_setkey_float(sharpoutrec, "USFLUXL", mean_vf_los); | drms_setkey_float(sharpoutrec, "USFLUXL", mean_vf_los); |
drms_setkey_float(sharpoutrec, "CMASKL", count_mask_los); | drms_setkey_float(sharpoutrec, "CMASKL", count_mask_los); |
| |
|
|
/***** MEANGBZ, Example Function 18 ************************************/ | /***** MEANGBZ, Example Function 18 ************************************/ |
if (meanglosflag) | if (meanglosflag) |
{ | { |
|
//printf("line 794\n"); |
// Compute Bz derivative | // Compute Bz derivative |
if (computeLOSderivative(los, dims, &mean_derivative_los, |
if (computeLOSderivative(los, dims, &mean_derivative_los, bitmask, derx_los, dery_los)) |
bitmask, derx_los, dery_los)) |
|
{ | { |
|
//printf("line 799\n"); |
mean_derivative_los = DRMS_MISSING_FLOAT; | mean_derivative_los = DRMS_MISSING_FLOAT; |
} | } |
| |
// Set sharp keys | // Set sharp keys |
|
//printf("mean_derivative_los=%f\n",mean_derivative_los); |
drms_setkey_float(sharpoutrec, "MEANGBL", mean_derivative_los); | drms_setkey_float(sharpoutrec, "MEANGBL", mean_derivative_los); |
| |
// Set sharp cea keys | // Set sharp cea keys |
|
|
} | } |
| |
/******************************* END FLAGS **********************************/ | /******************************* END FLAGS **********************************/ |
|
//printf("line809\n"); |
drms_free_array(bitmaskArray); | drms_free_array(bitmaskArray); |
drms_free_array(maskArray); | drms_free_array(maskArray); |
drms_free_array(bxArray); | drms_free_array(bxArray); |
|
|
drms_free_array(bz_errArray); | drms_free_array(bz_errArray); |
drms_free_array(losArray); | drms_free_array(losArray); |
free(cvsinfoall); | free(cvsinfoall); |
|
|
free(rim); | free(rim); |
free(p1p0); | free(p1p0); |
free(p1n0); | free(p1n0); |
|
|
| |
} //endfor | } //endfor |
| |
// free all the arrays |
|
free(fx); free(fy); free(fz); | free(fx); free(fy); free(fz); |
free(bh); free(bt); free(jz); | free(bh); free(bt); free(jz); |
free(bpx); free(bpy); free(bpz); | free(bpx); free(bpy); free(bpz); |
|
|
free(err_term2); | free(err_term2); |
free(err_term1); | free(err_term1); |
| |
|
|
// Close all the records | // Close all the records |
drms_close_records(sharpinrecset, DRMS_FREE_RECORD); | drms_close_records(sharpinrecset, DRMS_FREE_RECORD); |
drms_close_records(sharpceainrecset, DRMS_FREE_RECORD); | drms_close_records(sharpceainrecset, DRMS_FREE_RECORD); |