int CleanupSolution(AutoData *Data) { int i; int result = 1; if (Data->u != NULL) { FREE_DMATRIX(Data->u); Data->u = NULL; } if (Data->usm != NULL) { if (Data->usm[0] != NULL) { FREE_DMATRIX(Data->usm[0]); Data->usm[0] = NULL; } if (Data->usm[1] != NULL) { FREE_DMATRIX(Data->usm[1]); Data->usm[1] = NULL; } for (i=0; i<(int)(log2(Data->nsm)); i++) { FREE_DMATRIX(Data->usm[2+i]); Data->usm[2+i] = NULL; } FREE(Data->usm); Data->usm = NULL; } if (Data->par != NULL) { FREE_DMATRIX(Data->par); Data->par = NULL; } if (Data->ev != NULL) { FREE_DCMATRIX(Data->ev); Data->ev = NULL; } if (Data->c0 != NULL) { FREE_DMATRIX_3D(Data->c0); Data->c0 = NULL; } if (Data->c1 != NULL) { FREE_DMATRIX_3D(Data->c1); Data->c1 = NULL; } if (Data->a1 != NULL) { FREE_DMATRIX_3D(Data->a1); Data->a1 = NULL; } if (Data->a2 != NULL) { FREE_DMATRIX_3D(Data->a2); Data->a2 = NULL; } return result; }
int CleanupSpecialPoints(AutoData *Data) { AutoSPData *SPData = Data->sp; int result = 1; int i; if (SPData != NULL) { for (i = 0; i < Data->sp_len; i++) { if (SPData[i].icp != NULL) { FREE(SPData[i].icp); SPData[i].icp = NULL; } if (SPData[i].u != NULL) { FREE(SPData[i].u); SPData[i].u = NULL; } if (SPData[i].rldot != NULL) { FREE(SPData[i].rldot); SPData[i].rldot = NULL; } if (SPData[i].ups != NULL) { FREE_DMATRIX(SPData[i].ups); SPData[i].ups = NULL; } if (SPData[i].udotps != NULL) { FREE_DMATRIX(SPData[i].udotps); SPData[i].udotps = NULL; } if (SPData[i].a1 != NULL) { FREE_DMATRIX_3D(SPData[i].a1); SPData[i].a1 = NULL; } if (SPData[i].a2 != NULL) { FREE_DMATRIX_3D(SPData[i].a2); SPData[i].a2 = NULL; } } FREE(Data->sp); Data->sp = NULL; } return result; }
// Assumes there has been a call to SetData before this. int SetInitPoint(double *u, int npar, int *ipar, double *par, int *icp, int nups, double *ups, double *udotps, double *rldot, int adaptcycle) { /* Still think I should get rid of typemap(freearg) and send address to pointer in prepare_cycle so I can realloc if necessary and not have to use this my_... crap */ integer itp; integer i, j; integer SUCCESS = 1; double *my_ups = ups; double *my_udotps = udotps; double *my_rldot = rldot; if (ups == NULL) itp = 3; else { itp = 9; if (adaptcycle || udotps == NULL || rldot == NULL) { // NOTE: AUTO allocates (ntst+1)*ncol points, but only displays ntpl=ntst*ncol+1 my_ups = (double *)MALLOC(gIData->iap.ncol*(gIData->iap.ntst+1)*(gIData->iap.ndim+1)*sizeof(double)); my_udotps = (double *)MALLOC(gIData->iap.ncol*(gIData->iap.ntst+1)*gIData->iap.ndim*sizeof(double)); my_rldot = (double *)MALLOC(gIData->iap.nicp*sizeof(double)); prepare_cycle(gIData, ups, nups, my_ups, my_udotps, my_rldot); } } if (!CreateSpecialPoint(gIData, itp, 1, u, npar, ipar, par, icp, my_ups, my_udotps, my_rldot)) { fprintf(stderr,"*** Warning [interface.c]: Problem in CreateSpecialPoint.\n"); fflush(stderr); SUCCESS = 0; } if ((SUCCESS) && (itp == 9) && (adaptcycle || udotps == NULL || rldot == NULL)) { integer nmx, npr, verbosity; double ds, dsmin, dsmax; // Adjust rldot and sp.nfpr = 1 (AUTO detects this to get udotps and rldot for // starting point) gIData->sp[0].nfpr = 1; // Remove from here till } once findPeriodicOrbit is created FREE(my_ups); FREE(my_udotps); FREE(my_rldot); // Make sure initial point is on curve... nmx = gIData->iap.nmx; npr = gIData->iap.npr; ds = gIData->rap.ds; dsmin = gIData->rap.dsmin; dsmax = gIData->rap.dsmax; verbosity = gIData->verbosity; gIData->iap.nmx = 3; gIData->iap.npr = 3; gIData->rap.ds = min(1e-4, gIData->rap.ds); gIData->rap.dsmin = min(1e-4, gIData->rap.dsmin); gIData->rap.dsmax = min(1e-4, gIData->rap.dsmax); gIData->verbosity = 0; AUTO(gIData); CleanupSolution(gIData); gIData->iap.nmx = nmx; gIData->iap.npr = npr; gIData->rap.ds = ds; gIData->rap.dsmin = dsmin; gIData->rap.dsmax = dsmax; gIData->verbosity = verbosity; // Check for NaNs for (i=0; i<gIData->sp[0].nar; i++) { if (isnan(gIData->sp[1].u[i])) { fprintf(stderr,"*** Warning [interface.c]: NaNs in auto solution.\n"); fflush(stderr); SUCCESS = 0; break; } } if (SUCCESS) { for (i=0; i<gIData->sp[0].nar; i++) gIData->sp[0].u[i] = gIData->sp[1].u[i]; for (i=0; i<gIData->iap.ntst*gIData->iap.ncol+1; i++) for (j=0; j<gIData->iap.ndim+1; j++) gIData->sp[0].ups[i][j] = gIData->sp[1].ups[i][j]; for (i=0; i<gIData->iap.ntst*gIData->iap.ncol+1; i++) for (j=0; j<gIData->iap.ndim; j++) gIData->sp[0].udotps[i][j] = gIData->sp[1].udotps[i][j]; for (i=0; i<gIData->iap.nicp; i++) gIData->sp[0].rldot[i] = gIData->sp[1].rldot[i]; } gIData->sp[0].nfpr = gIData->iap.nicp; FREE(gIData->sp[1].icp); FREE(gIData->sp[1].u); FREE(gIData->sp[1].rldot); FREE_DMATRIX(gIData->sp[1].ups); FREE_DMATRIX(gIData->sp[1].udotps); if (gIData->sflow) { FREE_DMATRIX_3D(gIData->sp[1].a1); FREE_DMATRIX_3D(gIData->sp[1].a2); } gIData->sp[1].icp = NULL; gIData->sp[1].u = NULL; gIData->sp[1].rldot = NULL; gIData->sp[1].ups = NULL; gIData->sp[1].udotps = NULL; gIData->sp[1].a1 = NULL; gIData->sp[1].a2 = NULL; gIData->num_sp = 1; gIData->sp_len = 1; gIData->sp = (AutoSPData *)REALLOC(gIData->sp, (gIData->num_sp)*sizeof(AutoSPData)); } return SUCCESS; }