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;
}
示例#3
0
文件: automod.c 项目: F-A/pydstool
// 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;
}