void set_mv_float(float *f) { #ifdef HAVE_LIBCSF /* csftypes.h was included: */ SET_MV_REAL4(f); #else memset(f, 0xFF, sizeof(float)); #endif }
/* (LIBRARY_INTERNAL) */ void PutMVPrivate_REAL4( REAL4 **matrix, /* map matrix */ int r, /* row number */ int c) /* column number */ { SET_MV_REAL4( matrix[r]+c); }
static int BuildEllipse2(REAL8 xmajor_a, REAL8 yminor_b, REAL8 angle) { int i,nrLines,xCeil; int lineStart,lineEndIncl; REAL8 xIncr,c=cos(angle),s=sin(angle); HOR_CUT_LINE *l; PRECOND(xmajor_a != 0); PRECOND(yminor_b != 0); xmajor_a /= Side(); yminor_b /= Side(); xCeil = (size_t)ceil(xmajor_a); nrLines = (xCeil*2)+1; l = (HOR_CUT_LINE *)ChkMalloc(sizeof(HOR_CUT_LINE)*nrLines); for(i=0; i < nrLines; i++) { /* mark not initialized */ SET_MV_REAL4(&(l[i].start.f)); } for (xIncr = 0; xIncr < xCeil; xIncr+=1) { REAL8 y = sqrt( fabs(1-(sqr(xIncr)/sqr(xmajor_a)))*sqr(yminor_b)); Add2Lines(l,nrLines,xCeil,c,s, xIncr, y); Add2Lines(l,nrLines,xCeil,c,s, xIncr,-y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr, y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr,-y); } if (0) { REAL8 y; xIncr = xmajor_a; y = sqrt( fabs(1-(sqr(xIncr)/sqr(xmajor_a)))*sqr(yminor_b)); Add2Lines(l,nrLines,xCeil,c,s, xIncr, y); Add2Lines(l,nrLines,xCeil,c,s, xIncr,-y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr, y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr,-y); } for(i=0; i < nrLines; i++) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i < nrLines); lineStart = i; for(i = nrLines-1; i >=0;i--) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i >= 0); lineEndIncl = i; for (i=lineStart ; i <= lineEndIncl; i++) { PRECOND(!IS_MV_REAL4(&(l[i].start.f))); l[i].start.i = (int)Rint(l[i].start.f); l[i].end.i = (int)Rint(l[i].end.f); } return 1; }
void Do_sqrt( REAL4 *val, size_t n) { size_t i; for(i=0; i < n; i++) if (! IS_MV_REAL4(val+i)) { if (val[i] >= (REAL4)0.0) val[i] = (REAL4)sqrt(val[i]); else SET_MV_REAL4(val+i); } }
void Do_log10( REAL4 *val, size_t n) { size_t i; for(i=0; i < n; i++) if (! IS_MV_REAL4(val+i)) { if (val[i] > (REAL4)0.0) val[i] = (REAL4)log10((REAL4)val[i]); else SET_MV_REAL4(val+i); } }
void Do_cos_d( REAL4 *val, size_t n) { size_t i; for(i=0; i < n; i++) if (! IS_MV_REAL4(val+i)) { if (val[i] != (REAL4)-1) val[i] = (REAL4)cos((REAL4)val[i]); else SET_MV_REAL4(val+i); } }
void Do_acos( REAL4 *val, size_t n) { size_t i; for(i=0; i < n; i++) if (! IS_MV_REAL4(val+i)) { if (fabs(val[i]) > (REAL4)1.0) SET_MV_REAL4(val+i); else val[i] = (REAL4)acos((REAL4)val[i]); } }
static int BuildCircle(REAL8 radius) { int i,nrLines,xFloor; REAL8 xIncr,lineStart,lineEndIncl; HOR_CUT_LINE *l; PRECOND(radius != 0); radius /= (Side()*2); xFloor = (size_t)floor(radius); radius *= radius; nrLines = (xFloor*2)+1; l = (HOR_CUT_LINE *)ChkMalloc(sizeof(HOR_CUT_LINE)*nrLines); for(i=0; i < nrLines; i++) { /* mark not initialized */ SET_MV_REAL4(&(l[i].start.f)); } for (xIncr = 0; xIncr <= xFloor; xIncr+=1) { REAL8 y = floor(sqrt(radius-sqr(xIncr))); Add2Lines(l,nrLines,xFloor,1,0, xIncr, y); Add2Lines(l,nrLines,xFloor,1,0, xIncr,-y); Add2Lines(l,nrLines,xFloor,1,0,-xIncr, y); Add2Lines(l,nrLines,xFloor,1,0,-xIncr,-y); } for(i=0; i < nrLines; i++) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i < nrLines); lineStart = i; for(i = nrLines-1; i >=0;i--) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i >= 0); lineEndIncl = i; for (i=(int)lineStart ; i <= (int)lineEndIncl; i++) { PRECOND(!IS_MV_REAL4(&(l[i].start.f))); l[i].start.i = (int)Rint(l[i].start.f); l[i].end.i = (int)Rint(l[i].end.f); } return 1; }
void Do_tan_d( REAL4 *val, size_t n) { size_t i; REAL4 tan_mv1 = (REAL4)(M_PI*0.5); REAL4 tan_mv2 = (REAL4)(M_PI*1.5); for(i=0; i < n; i++) if (! IS_MV_REAL4(val+i)) { if ( (val[i] == -1) || tan_mv1 == val[i] || tan_mv2 == val[i]) SET_MV_REAL4(val+i); else val[i] = (REAL4)tan((REAL4)val[i]); } }
PCR_DLL_FUNC (const char *) pcr_LinkInExecute( const char *xmlNotUsed, LinkInTransferArray linkInTransferArray) { float *result = (float *)linkInTransferArray[0]; const float *spatial =(const float *)linkInTransferArray[1]; const float nonSpatial =((const float *)linkInTransferArray[2])[0]; int nrCells=nrRows*nrCols; int c; for(c=0; c < nrCells; c++) { if (IS_MV_REAL4(spatial+c)) SET_MV_REAL4(result+c); else result[c]=spatial[c]+nonSpatial; } /* no error */ return 0; }
void Do_asin( REAL4 *val, size_t n) { size_t i; double t; for(i=0; i < n; i++) if (! IS_MV_REAL4(val+i)) { t = val[i]; if (fabs(t) > (double)1.0) SET_MV_REAL4(val+i); else { t = asin(t); val[i] = (REAL4)ScaleRad(t); } } }
/* up to 34 is ok, 35 => infinite */ void Do_fac( REAL4 *val, size_t n) { size_t i; for(i=0; i < n; i++) if (! IS_MV_REAL4(val+i)) { float v = floor(val[i]); if (v > (REAL4)0.0 && v <= (REAL4)34.0 && v == val[i]) { float r = 1,n = 1; while (n <= v) { r *= n; n += 1; } val[i] = r; } else SET_MV_REAL4(val+i); } }