Esempio n. 1
0
void verify_node(KmerNode * node, KmerGraph *hashtable, unsigned kmer_length)
{
    int double_kmer_length = kmer_length << 1;
#ifdef LARGE_KMERS
    Kmer mask;
    mask.createMask(double_kmer_length);
#else
    Kmer mask = (Kmer(1) << double_kmer_length) - 1;
#endif
    Kmer kmer = node->kmer;
    Kmer rc_kmer = reverseComplement(kmer, kmer_length);
    char rightmost_base = KMER_GET_TAIL_BASE(kmer, kmer_length);
    char leftmost_base = KMER_GET_HEAD_BASE(kmer, kmer_length);
    KmerNode *node2;

    for (int i = 0 ; i < 4 ; ++ i) {
        // check on the left side
        int count = node->left_count[i];
        int color = node->left_color[i];
        assert( color == 0 || count != 0 );  // count must be non-zero if color is non-zero
        if (color == 0) {
            if (count > 0) {
                Kmer kmer2 = KMER_PREPEND(kmer, i, double_kmer_length, mask);
                node2 = hashtable->findNode(canonicalKmer(kmer2, kmer_length));
                assert( node2 != NULL );
                assert(cnorm(node2->right_count[static_cast<int>(rightmost_base)]) == cnorm(count));
                assert(node2->right_color[static_cast<int>(rightmost_base)] == 0);
            }	else if (count < 0) {
                Kmer kmer2 = KMER_APPEND(rc_kmer, i ^ 0x3, double_kmer_length);
                node2 = hashtable->findNode(canonicalKmer(kmer2, kmer_length));
                assert( node2 != NULL );
                assert(cnorm(node2->left_count[static_cast<int>( COMPLEMENT(rightmost_base) )]) == cnorm(count));
                assert(node2->left_color[static_cast<int>( COMPLEMENT(rightmost_base) )] == 0);
            }
        }

        // check on the right side
        count = node->right_count[i];
        color = node->right_color[i];
        assert( color == 0 || count != 0 );  // count must be non-zero if color is non-zero
        if (color == 0) {
            if (count > 0) {
                Kmer kmer2 = KMER_APPEND(kmer, i, double_kmer_length);
                node2 = hashtable->findNode(canonicalKmer(kmer2, kmer_length));
                assert( node2 != NULL );
                assert(cnorm(node2->left_count[static_cast<int>(leftmost_base)]) == cnorm(count));
                assert(node2->left_color[static_cast<int>(leftmost_base)] == 0);
            } else if (count < 0) {
                Kmer kmer2 = KMER_PREPEND(rc_kmer, i ^ 0x3, double_kmer_length, mask);
                node2 = hashtable->findNode(canonicalKmer(kmer2, kmer_length));
                assert( node2 != NULL );
                assert(cnorm(node2->right_count[static_cast<int>( COMPLEMENT(leftmost_base) )]) == cnorm(count));
                assert(node2->right_color[static_cast<int>( COMPLEMENT(leftmost_base) )] == 0);
            }
        }
    }
}
Esempio n. 2
0
int main()
{ 
   complex temp, z, prod;
   double radius;
   FILE *outfile;
   int n;
   char filename[100];

   temp.re = 1.0; temp.im = .05; 
   z = rdiv(temp,cnorm(temp));

   prod.re = 1.0; prod.im = 0.0;
   
   printf("Enter radius parameter:\n");
   scanf("%lf", &radius);
   printf("radius = %f\n", radius);
   z = rmul(radius,z);

   sprintf(filename,"cmultest_r%.2f.dat", radius);
   printf("Data stored in %s\n", filename); 
   outfile = fopen(filename, "w");

   for(n=0; n<120; n++)
   {
      fprintf(outfile,"%f\t%f\n", prod.re, prod.im);  /* print results */    
      prod = cmul(prod, z);
   } 

   return(0);
}
Esempio n. 3
0
static int circle(bool print)
{
    int angle_updates[ITERATIONS + 1];
    build_angle_updates(angle_updates);

#define NUM (2048)
#define SNUM (NUM / 2 + 1)
    double var = 0;
    double mean = 0;

    static double errors[NUM];
    static complex spectrum[SNUM];
    fftw_plan plan = fftw_plan_dft_r2c_1d(NUM, errors, spectrum, 0);

    for (int i = 0; i != NUM; ++i) {
        double angle = (i + drand48()) * (2 * M_PI / NUM);
        assert (0 < angle && angle < 2 * M_PI);
        word_t qq = CMASK((long) floor(cos(angle) * (1l << 32)));
        word_t ii = CMASK((long) floor(sin(angle) * (1l << 32)));
        double err = terror(qq, ii, angle_updates);
        errors[i] = err;
        var += err * err;
        mean += err;
        if (print)
            printf("%5i % .2f\n", i, err);
    }

    mean /= NUM;
    var = var / NUM - mean * mean;
    fprintf(stderr, "Mean = %f, var = %f, std. dev. = %f\n",
            mean, var, sqrt(var));

    //fftw_execute_dft_r2c(plan, errors, spectrum);
    fftw_execute(plan);

    static enum_double power[SNUM];
    for (int i = 1; i != SNUM; ++i)
        power[i] = (enum_double) { i, cnorm(spectrum[i]) };

    qsort(power, SNUM - 1, sizeof(enum_double), compare_enum_double);
    fprintf(stderr, "Harmonic Amplitude   Real      Imaginary\n");
    for (int i = 0; i != 10; ++i) {
        int index = power[i].index;
        fprintf(stderr, " %7i %8.4f%%  % f % f\n",
                index, sqrt(power[i].value) * (100.0 / NUM),
                creal(spectrum[index]),
                cimag(spectrum[index]));
    }
    fftw_destroy_plan(plan);
    fftw_cleanup();

    return 0;
}
Esempio n. 4
0
void model_parameters::initialization(void)
{
	NAreaAge.initialize();
 	CatchAreaAge.initialize();
 	CatchNatAge.initialize();
	Nage(1,1) = So*Bo/(1+beta*Bo);
	for(int i=sage+1 ; i <= nage ; i++)
	{
		Nage(1,i) = Nage(1,i-1) * mfexp(-za(i-1));
	}
	VulB(1) = elem_prod(elem_prod(Nage(1),va),wa);
	SB(1) = elem_prod(Nage(1),fa)*wa/2;
	tBo = Nage(1)*wa;
	calcmaxpos(tBo);
	varPos = maxPos*cvPos;
	PosX(1) = minPos + (maxPos - minPos) * (0.5+0.5*sin(indmonth(1)*PI/6 - mo*PI/6)); 
	VBarea(1,sarea) = VulB(1)* (cnorm(areas(sarea)+0.5,PosX(1),varPos));
	for(int r=sarea+1 ; r <= narea-1 ; r++)
	{
		VBarea(1,r) = VulB(1)* (cnorm(areas(r)+0.5,PosX(1),varPos)-cnorm(areas(r)-0.5,PosX(1),varPos));
		NAreaAge(1)(r) = elem_prod(Nage(1)(sage,nage),(cnorm(areas(r)+0.5,PosX(1),varPos)-cnorm(areas(r)-0.5,PosX(1),varPos)));
	}
	//VBarea(1,narea) = VulB(1)* (1.0-cnorm(areas(narea)-0.5,PosX(1),varPos));
	NationVulB(1,1) = sum(VBarea(1)(sarea,sarea+nationareas(1)-1)); 
	NationVulB(1,2) = sum(VBarea(1)(sarea+nationareas(1),narea)); 
	dvar_vector tmp1(sarea,narea);
	dvar_vector tmp2(sarea,narea);
	dvar_vector tmp3(sarea,narea);
	for(int rr= sarea; rr<=narea; rr++)
	{
		tmp1(rr)= VBarea(1)(rr)/ (NationVulB(1)(indnatarea(rr)) + 0.0001);
		tmp2(rr) = tmp1(rr)*TotEffyear(indnatarea(rr))(indyr(1));
		Effarea(1)(rr) = tmp2(rr)*TotEffmonth(indnatarea(rr))(indmonth(1));
	}
	for(int a= sage; a<= nage;a++)
	{
		dvar_vector propVBarea(sarea,narea);
		for(int rr =sarea; rr<=narea; rr++)
		{
			propVBarea(rr) = (cnorm(areas(rr)+0.5,PosX(1),varPos)-cnorm(areas(rr)-0.5,PosX(1),varPos))(a-sage+1);
			CatchAreaAge(1)(rr)(a) = q*Effarea(1)(rr)*va(a)/(q*Effarea(1)(rr)*va(a)+m)*(1-mfexp(-(q*Effarea(1)(rr)*va(a)+m)))*NAreaAge(1)(rr)(a);
			CatchNatAge(1)(indnatarea(rr))(a) += CatchAreaAge(1)(rr)(a);
			EffNatAge(indnatarea(rr))(1)(sage-2) = 1;
			EffNatAge(indnatarea(rr))(1)(sage-1) = indnatarea(rr);
			EffNatAge(indnatarea(rr))(1)(a) += Effarea(1)(rr)*propVBarea(rr);
		}
		//cout<<"propVBarea "<<propVBarea<<endl;
		//cout<<"Effarea(1) "<<Effarea(1)<<endl;
		Effage(1)(a) = Effarea(1)* propVBarea;
	}
}
Esempio n. 5
0
File: field.c Progetto: rennone/C
void field_outputAllDataComplex(const char *fileName, double complex *data)
{
   printf("output all data start\n");
  //file open
  FILE *fp;

  if( (fp=fopen(fileName, "w") ) == NULL){
    printf("cannot open file %s \n", fileName);
    exit(2);
  }

  for(int i=0; i<N_PX; i++){
    for(int j=0; j<N_PY; j++){
      fprintf(fp, "%lf \n",cnorm(data[ind(i,j)]));
    }
  }
  
  fclose(fp);
  printf("output all data to %s end\n", fileName);
}
Esempio n. 6
0
File: field.c Progetto: rennone/C
void field_outputElliptic(const char *fileName, double complex* data)
{
  printf("output start\n");
  //file open
  FILE *fp;

  if( (fp=fopen(fileName, "w") ) == NULL){
    printf("cannot open file %s \n", fileName);
    exit(2);
  }

  for(int ang=180; ang >=0; ang--){
    double rad = ang*M_PI/180.0;
    double x = 1.2*lambda_s*cos(rad)+N_PX/2.0;
    double y = 1.2*lambda_s*sin(rad)+N_PY/2.0;
    double norm = cnorm(cbilinear(data,x,y,N_PX,N_PY));
    fprintf(fp, "%d %lf \n", ang, norm);    
  }
  
  fclose(fp);
  printf("output to %s end\n", fileName);
}
Esempio n. 7
0
File: fft.c Progetto: geoffryan/cow
void cow_fft_pspecvecfield(cow_dfield *f, cow_histogram *hist)
// -----------------------------------------------------------------------------
// This function computes the spherically integrated power spectrum of the
// vector field represented in `f`. The user needs to supply a half-initialized
// histogram, which has not yet been committed. This function will commit,
// populate, and seal the histogram by doing the FFT's on the vector field
// components. The supplies the fields like in the example below, all other will
// be over-written.
//
//  cow_histogram_setnbins(hist, 0, 256);
//  cow_histogram_setspacing(hist, COW_HIST_SPACING_LINEAR); // or LOG
//  cow_histogram_setnickname(hist, "mypspec"); // optional
//
// -----------------------------------------------------------------------------
{
#if (COW_FFTW)
  if (!f->committed) return;
  if (f->n_members != 3) {
    printf("[%s] error: need a 3-component field for %s", MODULE, __FUNCTION__);
    return;
  }

  clock_t start = clock();
  int nx = cow_domain_getnumlocalzonesinterior(f->domain, 0);
  int ny = cow_domain_getnumlocalzonesinterior(f->domain, 1);
  int nz = cow_domain_getnumlocalzonesinterior(f->domain, 2);
  int Nx = cow_domain_getnumglobalzones(f->domain, 0);
  int Ny = cow_domain_getnumglobalzones(f->domain, 1);
  int Nz = cow_domain_getnumglobalzones(f->domain, 2);
  int ng = cow_domain_getguard(f->domain);
  int ntot = nx * ny * nz;
  int I0[3] = { ng, ng, ng };
  int I1[3] = { nx + ng, ny + ng, nz + ng };
  double norm = pow(cow_domain_getnumglobalzones(f->domain, COW_ALL_DIMS), 2.0);
  double *input = (double*) malloc(3 * ntot * sizeof(double));
  cow_dfield_extract(f, I0, I1, input);

  FFT_DATA *gx = _fwd(f->domain, input, 0, 3); // start, stride
  FFT_DATA *gy = _fwd(f->domain, input, 1, 3);
  FFT_DATA *gz = _fwd(f->domain, input, 2, 3);
  free(input);

  cow_histogram_setlower(hist, 0, 1.0);
  cow_histogram_setupper(hist, 0, 0.5*sqrt(Nx*Nx + Ny*Ny + Nz*Nz));
  cow_histogram_setbinmode(hist, COW_HIST_BINMODE_DENSITY);
  cow_histogram_setdomaincomm(hist, f->domain);
  cow_histogram_commit(hist);
  for (int i=0; i<nx; ++i) {
    for (int j=0; j<ny; ++j) {
      for (int k=0; k<nz; ++k) {
	int m = i*ny*nz + j*nz + k;
	double kvec[3];
        double khat[3];
	khat_at(f->domain, i, j, k, khat);
	// ---------------------------------------------------------------------
	// Here we are taking the complex norm (absolute value squared) of the
	// vector-valued Fourier amplitude corresponding to the wave-vector, k.
	//
	//                        P(k) = |\vec{f}_\vec{k}|^2
	//
	// ---------------------------------------------------------------------
	double Kijk = k_at(f->domain, i, j, k, kvec);
	double Pijk = cnorm(gx[m]) + cnorm(gy[m]) + cnorm(gz[m]);
	cow_histogram_addsample1(hist, Kijk, Pijk/norm);
      }
    }
  }
  cow_histogram_seal(hist);
  free(gx);
  free(gy);
  free(gz);
  printf("[%s] %s took %3.2f seconds\n",
	 MODULE, __FUNCTION__, (double) (clock() - start) / CLOCKS_PER_SEC);
#endif // COW_FFTW
}
Esempio n. 8
0
// we know that this "node" is a node that has either no neighbors on
// one side -or- connects to a chain of nodes that leads to a single node.
static bool
check_for_tip_removal(SeqGraph *graph, SeqNode *node, bool moving_right, bool singlecopy_tip, unsigned length)
{
    // XXX: performance optimization not correctness, right?
#ifdef VELOUR_TBB
    if (atomic_isNodeDead<SeqNode>(node)) { return false; }
#else
    if (isNodeDead<SeqNode>(node)) { return false; }
#endif

	length += node->sequence.get_length() - g__FULLKMER_LENGTH + 1;
    singlecopy_tip &= (isNodeWeight_None(node) || isNodeWeight_AllSingleCopy(node));

	if (length >= TIP_REMOVAL_LENGTH && !singlecopy_tip) { // FIXME? singlecopy_tip might be incorrect as didn't consider forward arc???
		return false;  // can't remove a tip that is too long
	}

	// find out if this tip can be extended.  This has two conditions:
	// CONDITION 1: there is a single neighbor in the extension direction
#ifdef VELOUR_TBB
    union {
        counter_t count[4];
        four_counter_t side;
    } local_counters;
    local_counters.side = moving_right ? ATOMIC_LOAD(node->right_side) : ATOMIC_LOAD(node->left_side);
	counter_t   *counters = local_counters.count;
#else
	counter_t   *counters = moving_right ? node->right_count : node->left_count;
#endif

	int valid_dir = valid_single_successor(counters);

	if (valid_dir == MULTIPLE_SUCCESSORS) {  
		return false; // can't remove a tip with two outgrowths (the base of a Y)
	}

	if (valid_dir == NO_SUCCESSORS) {
#ifdef VELOUR_TBB
        atomic_setNodeDead<SeqNode>(node);
        ATOMIC_STORE(node->connections) = 0;
        ATOMIC_STORE(node->left_side_colors) = 0;
        ATOMIC_STORE(node->right_side_colors) = 0;
        ATOMIZE(DISCONNECTED_CHUNKS).fetch_and_increment();
#else
        setNodeDead<SeqNode>(node);
		node->connections = 0;
        node->left_side_colors = 0;
        node->right_side_colors = 0;
        ++ DISCONNECTED_CHUNKS;
#endif
		// printf("a disconnected chunk of length %d\n", length);
		return true;
	}

	// a single successor
	// CONDITION 2: the node in the extension direction has a single
	// neighbor in the direction facing this node
	assert((valid_dir >= 0) && (valid_dir < 4));
	bool sense_changed;
#ifdef VELOUR_TBB
    union {
        color_t color[4];
        four_color_t side;
    } local_colors;
    local_colors.side = moving_right ? ATOMIC_LOAD(node->right_side_colors) : ATOMIC_LOAD(node->left_side_colors);
    color_t *colors = local_colors.color;
#else
    color_t *colors = moving_right ? node->right_color : node->left_color;
#endif
    SeqNode *next = NULL;
    if (colors[valid_dir] == 0) {
        next = graph->findNextNode(node, valid_dir, moving_right, &sense_changed);
    } else {
        return false;
	}
    assert( next != NULL );

	bool next_moving_right = moving_right ^ sense_changed;
#ifdef VELOUR_TBB
    union {
        counter_t count[4];
        four_counter_t side;
    } local_back_counters;
    local_back_counters.side = next_moving_right ? ATOMIC_LOAD(next->left_side) : ATOMIC_LOAD(next->right_side);
	counter_t *next_back_counters = local_back_counters.count;
#else
	counter_t *next_back_counters = next_moving_right ? next->left_count : next->right_count;
#endif

	int next_back_valid = valid_single_successor(next_back_counters);

	if (next_back_valid != MULTIPLE_SUCCESSORS) {
        bool forceclip = (abs(next_back_counters[next_back_valid]) == CLIP_SINGLECOPY_COUNTER_VALUE);
        singlecopy_tip &= cnorm(counters[valid_dir]) == 1;
		bool remove = check_for_tip_removal(graph, next, next_moving_right, singlecopy_tip, length);
		if (remove || singlecopy_tip || forceclip) {
#ifdef VELOUR_TBB
            atomic_setNodeDead<SeqNode>(node);
            ATOMIC_STORE(node->connections) = 0;
            ATOMIC_STORE(node->left_side_colors) = 0;
            ATOMIC_STORE(node->right_side_colors) = 0;
#else
            setNodeDead<SeqNode>(node);
			node->connections = 0;
            node->left_side_colors = 0;
            node->right_side_colors = 0;
#endif
        }
        
        if (!remove && (singlecopy_tip || forceclip)) {
#ifdef VELOUR_TBB
            ATOMIC_STORE( (next_moving_right ? next->left_count : next->right_count)[next_back_valid] ) = 0;
            ATOMIC_STORE( (next_moving_right?next->left_color:next->right_color)[next_back_valid] ) = 0;
#else
            next_back_counters[next_back_valid] = 0;
            (next_moving_right?next->left_color:next->right_color)[next_back_valid] = 0;
#endif
        }
        return remove || singlecopy_tip || forceclip;
	}

	// can't extend.  Need to determine if we should trim.
	counter_t max_value = get_counter_max(next_back_counters);
	counter_t value = abs(counters[valid_dir]);
    if (value == CLIP_SINGLECOPY_COUNTER_VALUE) value = 1;
	if ((value >= g_minimum_edge_weight) && (value == max_value)) {
		// printf("dominant connection: length %d, weight %d\n", length, abs(counters[valid_dir]));
		return false;   // can't remove the dominant connection
	}

  // check for multiple single-copy predecessors in next node; mark those arcs as potential clips
  if (value == 1 && value == max_value) {
    for (int i = 0 ; i < 4 ; ++ i) {
        if (next_back_counters[i] == 1) {
#ifdef VELOUR_TBB
            ATOMIC_STORE( (next_moving_right ? next->left_count : next->right_count)[i] ) = CLIP_SINGLECOPY_COUNTER_VALUE;
#else
            next_back_counters[i] = CLIP_SINGLECOPY_COUNTER_VALUE;
#endif
        } else if (next_back_counters[i] == -1) {
#ifdef VELOUR_TBB
            ATOMIC_STORE( (next_moving_right ? next->left_count : next->right_count)[i] ) = - CLIP_SINGLECOPY_COUNTER_VALUE;
#else
            next_back_counters[i] = - CLIP_SINGLECOPY_COUNTER_VALUE;
#endif
        }
    }
  }

	// if we are clipping the tip, then mark the current "node" for
	// removal and disconnect the "next" node from the tip.  

/*
#ifdef VERIFY
  verify_node(node, HASHTABLE, g__FULLKMER_LENGTH);     // FINE, BEFORE WE LET IT GET INCONSISTENT.
  verify_node(next, HASHTABLE, g__FULLKMER_LENGTH);
#endif
*/

	// Note: we remove the link from "next", but not from "node".  The
	// reason why is that we don't want code to start on the other side
	// thinking that it is a tip that might need removal.  This means 
	// that from "node's" perspective, the graph looks inconsistent, but
	// that is okay, since we're going to remove "node" shortly.
#ifdef VELOUR_TBB
    atomic_setNodeDead<SeqNode>(node);
    ATOMIC_STORE(node->connections) = 0;
    ATOMIC_STORE(node->left_side_colors) = 0;
    ATOMIC_STORE(node->right_side_colors) = 0;
#else
    setNodeDead<SeqNode>(node);
	node->connections = 0;
    node->left_side_colors = 0;
    node->right_side_colors = 0;
#endif
	// printf("removal candidate: length %d, weight %d\n", length, abs(counters[valid_dir]));

	Nucleotide head_rightmost_base = node->sequence.GetHeadKmerRightmostBase(g__FULLKMER_LENGTH);
	Nucleotide tail_leftmost_base = node->sequence.GetTailKmerLeftmostBase(g__FULLKMER_LENGTH);
	next_back_valid = moving_right ? tail_leftmost_base : head_rightmost_base;

	if (sense_changed) { next_back_valid ^= 0x3; } // FIXME: i.e. complement??
           
#ifdef VELOUR_TBB 
    ATOMIC_STORE( (next_moving_right?next->left_color:next->right_color)[next_back_valid] ) = 0;
#else
    (next_moving_right?next->left_color:next->right_color)[next_back_valid] = 0;
#endif
  
#ifdef VELOUR_TBB
    ATOMIC_STORE( (next_moving_right ? next->left_count : next->right_count)[next_back_valid] ) = 0;
#else
	next_back_counters[next_back_valid] = 0;
#endif

#ifdef VELOUR_TBB
    ATOMIZE(TIP_DETACHED).fetch_and_increment();
#else
	++ TIP_DETACHED;
#endif

/*
#ifdef VERIFY
	// verify_node(node, g__FULLKMER_LENGTH);  // THIS VALIDATION WOULD FAIL, SINCE WE DON'T MODIFY NODE
	verify_node(next, HASHTABLE, g__FULLKMER_LENGTH);
#endif
*/

  	return true;
}
Esempio n. 9
0
void model_parameters::move_grow_die(void)
{
	dvariable tB;
	for(int i=2;i<=ntstp;i++)
	{
		//if(i>12)exit(1);
		switch (indmonth(i)) {
            case 1:           	
            	Nage(i)(sage) = (So*SB(i-nmon)/(1.+beta*SB(i-nmon)))*mfexp(wt(indyr(i))*err);
            	for(int a = sage+1;a<=nage;a++)
            	{
            		Nage(i)(a) = Nage(i-1)(a-1)*mfexp(-(m+q*Effage(i-1)(a-1)*va(a-1))/12);
            	}
            	break;
            default: 
            	Nage(i) = elem_prod(Nage(i-1),mfexp(-(m+q*elem_prod(Effage(i-1),va))/12));
            	break;
        }
		VulB(i) = elem_prod(elem_prod(Nage(i),va),wa);
		SB(i) = elem_prod(Nage(i),fa)*wa/2;
		maxPos.initialize();
		tB = Nage(i)*wa;
		calcmaxpos(tB);
		//cout<<"maxPos "<<maxPos<<endl;
		varPos = maxPos*cvPos;
		PosX(i) = minPos + (maxPos - minPos) * (0.5+0.5*sin(indmonth(i)*PI/6 - mo*PI/6)); 
		VBarea(i,sarea) = VulB(i)* (cnorm(areas(sarea)+0.5,PosX(i),varPos));
		for(int r = sarea+1;r <= narea;r++)
		{
			VBarea(i)(r) = VulB(i)* (cnorm(areas(r)+0.5,PosX(i),varPos)-cnorm(areas(r)-0.5,PosX(i),varPos));
			NAreaAge(i)(r) = elem_prod(Nage(i)(sage,nage),(cnorm(areas(r)+0.5,PosX(i),varPos)-cnorm(areas(r)-0.5,PosX(i),varPos)));
		}	
		//VBarea(i,narea) = VulB(i)* (1.0-cnorm(areas(narea)-0.5,PosX(i),varPos));
		NationVulB(i,1) = sum(VBarea(i)(sarea,sarea+nationareas(1)-1)); 
		NationVulB(i,2) = sum(VBarea(i)(sarea+nationareas(1),narea)); 
		dvar_vector tmp1(sarea,narea);
		dvar_vector tmp2(sarea,narea);
		for(int rr= sarea; rr<=narea; rr++)
		{
			tmp1(rr)= VBarea(i)(rr)/ (NationVulB(i)(indnatarea(rr)) + 1);
			tmp2(rr) = tmp1(rr)*TotEffyear(indnatarea(rr))(indyr(i));
			Effarea(i)(rr) = tmp2(rr)*TotEffmonth(indnatarea(rr))(indmonth(i));
		}
		for(int a = sage; a<=nage;a++)
		{
			dvar_vector propVBarea(sarea,narea);
			for(int rr =sarea; rr<=narea; rr++)
			{
				propVBarea(rr) = (cnorm(areas(rr)+0.5,PosX(i),varPos)-cnorm(areas(rr)-0.5,PosX(i),varPos))(a-sage+1);
				EffNatAge(indnatarea(rr))(i)(sage-2) = i;
				EffNatAge(indnatarea(rr))(i)(sage-1) = indnatarea(rr);
				EffNatAge(indnatarea(rr))(i)(a) += Effarea(i)(rr)* propVBarea(rr);
			}
			//cout<<"propVBarea "<<propVBarea<<endl;
			//cout<<"Effarea(1) "<<Effarea(1)<<endl;
			Effage(i)(a) = Effarea(i)*propVBarea;
		}
		for(int r = sarea+1;r <= narea-1;r++)
		{
			for(int a = sage; a<=nage;a++)
			{
				CatchAreaAge(i)(r)(a) = q*Effarea(i)(r)*va(a)/(q*Effarea(i)(r)*va(a)+m)*(1-mfexp(-(q*Effarea(i)(r)*va(a)+m)))*NAreaAge(i)(r)(a);
				CatchNatAge(i)(indnatarea(r))(a)+= CatchAreaAge(i)(r)(a);
			}
		}
	}
}