#include "solution.h"
int allocateSolution(size_t neq, 
		     int nThreads,
		     N_Vector *y, 
		     N_Vector *ydot, 
		     N_Vector *res, 
		     N_Vector *id, 
		     N_Vector *atolv,
		     N_Vector *constraints){


  	*y = N_VNew_OpenMP(neq,nThreads);
  	if(*y==NULL){
		printf("Allocation Failed!\n");
		return(1);
	}
  	N_VConst((realtype)(0.0e0), *y);

  	*ydot = N_VNew_OpenMP(neq,nThreads);
  	if(*ydot==NULL){
		printf("Allocation Failed!\n");
		return(1);
	}
  	N_VConst((realtype)(0.0e0), *ydot);

  	*res = N_VNew_OpenMP(neq,nThreads);
  	if(*res==NULL){
		printf("Allocation Failed!\n");
		return(1);
	}
  	N_VConst((realtype)(0.0e0), *res);

  	*id = N_VNew_OpenMP(neq,nThreads);
  	if(*id==NULL){
		printf("Allocation Failed!\n");
		return(1);
	}
  	N_VConst((realtype)(1.0e0), *id);

  	*atolv = N_VNew_OpenMP(neq,nThreads);
  	if(*atolv==NULL){
		printf("Allocation Failed!\n");
		return(1);
	}
  	N_VConst((realtype)(0.0e0), *atolv);

  	*constraints = N_VNew_OpenMP(neq,nThreads);
  	if(*constraints==NULL){
		printf("Allocation Failed!\n");
		return(1);
	}
  	N_VConst((realtype)(0.0e0), *constraints);

	return(0);
}

void freeSolution(N_Vector *y, 
		  N_Vector *ydot, 
		  N_Vector *res, 
		  N_Vector *id, 
		  N_Vector *atolv,
		  N_Vector *constraints){

  	if(*y!=NULL){
		N_VDestroy_OpenMP(*y);
		printf("y Destroyed!\n");
	}
	if(*ydot!=NULL){
  		N_VDestroy_OpenMP(*ydot);
		printf("ydot Destroyed!\n");
	}
	if(*res!=NULL){
  		N_VDestroy_OpenMP(*res);
		printf("res Destroyed!\n");
	}
	if(*id!=NULL){
  		N_VDestroy_OpenMP(*id);
		printf("id Destroyed!\n");
	}
	if(*atolv!=NULL){
  		N_VDestroy_OpenMP(*atolv);
		printf("atolv Destroyed!\n");
	}

	if(*constraints!=NULL){
  		N_VDestroy_OpenMP(*constraints);
		printf("constraints Destroyed!\n");
	}
	printf("\n\n");
}
