double VectorMultiColvar::doCalculation(){
  // Now calculate the vector
  calculateVector();
  // Sort out the active derivatives
  updateActiveAtoms();

  // Now calculate the norm of the vector (this is what we return here)
  double norm=0, inorm;
  if(complexvec){
     for(unsigned i=0;i<ncomponents;++i) norm += getComponent(i)*getComponent(i) + getImaginaryComponent(i)*getImaginaryComponent(i); 
     norm=sqrt(norm); inorm = 1.0 / norm;
     for(unsigned i=0;i<ncomponents;++i){ dervec[i] = inorm*getComponent(i); dervec[ncomponents+i] = inorm*getImaginaryComponent(i); } 
  } else {
     for(unsigned i=0;i<ncomponents;++i) norm += getComponent(i)*getComponent(i);
     norm=sqrt(norm); inorm = 1.0 / norm;
     for(unsigned i=0;i<ncomponents;++i) dervec[i] = inorm*getComponent(i); 
  }

  if( usingLowMem() ){
     vecs->storeDerivativesLowMem( 0 );
     vecs->chainRule( 0, dervec );
  } else {
     vecs->storeDerivativesHighMem( getCurrentPositionInTaskList() );
     vecs->chainRule( getCurrentPositionInTaskList(), dervec );
  }

  // Add derivatives to base multicolvars
  Vector tmpd;
  for(unsigned i=0;i<atoms_with_derivatives.getNumberActive();++i){
       unsigned k=atoms_with_derivatives[i];
       tmpd[0]=vecs->getFinalDerivative(3*i+0); 
       tmpd[1]=vecs->getFinalDerivative(3*i+1); 
       tmpd[2]=vecs->getFinalDerivative(3*i+2); 
       MultiColvarBase::addAtomsDerivatives( 0, k, tmpd );
  }   
  unsigned vvbase=3*atoms_with_derivatives.getNumberActive(); Tensor tmpv;
  for(unsigned i=0;i<3;++i){
      for(unsigned j=0;j<3;++j){
          tmpv(i,j) = vecs->getFinalDerivative( vvbase+3*i+j ); 
      }   
  }   
  MultiColvarBase::addBoxDerivatives( 0, tmpv );

  
  return norm;
}
void BridgedMultiColvarFunction::performTask(){
  atoms_with_derivatives.deactivateAll();

  if( !myBridgeVessel->prerequisitsCalculated() ){
      mycolv->setTaskIndexToCompute( getCurrentPositionInTaskList() );
      mycolv->performTask();
  } else {

  }

  completeTask();
  atoms_with_derivatives.updateActiveMembers();
}
void BridgedMultiColvarFunction::performTask(){
  atoms_with_derivatives.deactivateAll();

  if( !myBridgeVessel->prerequisitsCalculated() ){
      mycolv->setTaskIndexToCompute( getCurrentPositionInTaskList() );
      mycolv->performTask();
  } else {

  }

  completeTask();
  atoms_with_derivatives.emptyActiveMembers();
  if( mycolv->isDensity() ){
     for(unsigned j=0;j<mycolv->atomsWithCatomDer.getNumberActive();++j) atoms_with_derivatives.updateIndex( mycolv->atomsWithCatomDer[j] );
  } else {
     for(unsigned j=0;j<mycolv->atoms_with_derivatives.getNumberActive();++j) atoms_with_derivatives.updateIndex( mycolv->atoms_with_derivatives[j] );
  }
  atoms_with_derivatives.sortActiveList();
}