Skip to content
Snippets Groups Projects
Select Git revision
  • master
  • feat-add_graphviz_wf
  • experimental_rel protected
  • lab-jupyterlab4 protected
  • snudda_2.2.2
  • add-nestml-tests
  • ebrains-25-02 protected
  • lab-widgets protected
  • ebrains-24-04 protected
  • feat_add_py-jaxley
  • feat_JUSUF_image protected
  • fix-k8s-job-cache-dir
  • test_open3d
  • add-music
  • add_gcc-spinnaker
  • disable-view
  • test_quiggeldy_service
  • image_build
  • update-readme
  • create-module-file
  • v24.04
  • v25.02
  • v23.09
  • v23.06
  • v23.02
  • v22.10
  • v22.07
27 results

package.py

Blame
  • VoxelPoolsBase.h 9.67 KiB
    /**********************************************************************
    ** This program is part of 'MOOSE', the
    ** Messaging Object Oriented Simulation Environment.
    **           Copyright (C) 2003-2014 Upinder S. Bhalla. and NCBS
    ** It is made available under the terms of the
    ** GNU Lesser General Public License version 2.1
    ** See the file COPYING.LIB for the full notice.
    **********************************************************************/
    
    #ifndef _VOXEL_POOLS_BASE_H
    #define _VOXEL_POOLS_BASE_H
    
    #include <map>
    #include <vector>
    
    using namespace std;
    
    class RateTerm;
    class Stoich;
    class Id;
    
    /**
     * This is the base class for voxels used in reac-diffusion systems.
     * Each voxel manages all the molecular pools that live in it. This
     * is the S_ and Sinit_ vectors.
     * Additionally, the last set of entries in S_ and Sinit_ refer to the
     * proxy pools that participate in cross-node reactions, but are really
     * located on other compartments.
     */
    
    class VoxelPoolsBase
    {
    public:
        VoxelPoolsBase();
        virtual ~VoxelPoolsBase();
    
        //////////////////////////////////////////////////////////////////
        // Compute access operations.
        //////////////////////////////////////////////////////////////////
        /// Allocate # of pools
        void resizeArrays( unsigned int totNumPools );
    
        /**
         * Returns # of pools
         */
        unsigned int size() const;
    
        /**
         * Returns the array of doubles of current mol #s at the specified
         * mesh index
         */
        const double* S() const;
    
        /// Returns a handle to the mol # vector.
        vector< double >& Svec();
    
        /**
         * Returns the array of doubles of current mol #s at the specified
         * mesh index. Dangerous, allows one to modify the values.
         */
        double* varS();
    
        /**
         * Returns the array of doubles of initial mol #s at the specified
         * mesh index
         */
        const double* Sinit() const;
    
        /**
         * Returns the array of doubles of initial mol #s at the specified
         * mesh index, as a writable array.
         */
        double* varSinit();
    
        /**
         * Assigns S = Sinit and sets up initial dt.
         */
        void reinit();
    
        /// Just assigns the volume without any cascading to other values.
        void setVolume( double vol );
        /// Return the volume of the voxel.
        double getVolume() const;
    
        /**
         * Assign the volume, and handle the cascading effects by scaling
         * all the dependent values of nInit and rates if applicable.
         */
        virtual void setVolumeAndDependencies( double vol );
    
        //////////////////////////////////////////////////////////////////
        // Field assignment functions
        //////////////////////////////////////////////////////////////////
    
        void setN( unsigned int i, double v );
        double getN( unsigned int ) const;
        void setNinit( unsigned int, double v );
        double getNinit( unsigned int ) const;
        void setDiffConst( unsigned int, double v );
        double getDiffConst( unsigned int ) const;
        //////////////////////////////////////////////////////////////////
        // Functions to set up rates vector
        //////////////////////////////////////////////////////////////////
        /**
         * Reassign entire rate vector.
         */
        virtual void updateAllRateTerms( const vector< RateTerm* >& rates,
                                         unsigned int numCoreRates ) = 0;
    
        /**
         * Update specified index on rate terms. The entire rates vector is
         * passed in for the source values, the index specifies which
         * entry on the local rate vector is to be updated.
         */
        virtual void updateRateTerms( const vector< RateTerm* >& rates,
                                      unsigned int numCoreRates, unsigned int index ) = 0;
    
        /**
         * Changes cross rate terms to zero if there is no junction
         */
        void filterCrossRateTerms( const vector< Id >& offSolverReacs, const vector< pair< Id, Id > >& offSolverReacCompts );
    
        //////////////////////////////////////////////////////////////////
        // Functions to handle cross-compartment reactions.
        //////////////////////////////////////////////////////////////////
        /**
         * Digests incoming data values for cross-compt reactions.
         * Sums the changes in the values onto the specified pools.
         */
        void xferIn( const vector< unsigned int >& poolIndex,
                     const vector< double >& values,
                     const vector< double >& lastValues,
                     unsigned int voxelIndex );
    
        /**
         * Used during initialization: Takes only the proxy pool values
         * from the incoming transfer data, and assigns it to the proxy
         * pools on current solver
         */
        void xferInOnlyProxies(
            const vector< unsigned int >& poolIndex,
            const vector< double >& values,
            unsigned int numProxyPools,
            unsigned int voxelIndex	);
    
        /// Assembles data values for sending out for x-compt reacs.
        void xferOut( unsigned int voxelIndex,
                      vector< double >& values,
                      const vector< unsigned int >& poolIndex );
        /// Adds the index of a voxel to which proxy data should go.
        void addProxyVoxy( unsigned int comptIndex,
                           Id comptId, unsigned int voxel );
        void addProxyTransferIndex( unsigned int comptIndex,
                                    unsigned int transferIndex );
    
        /**
         * Assigns the Id and volume of the specified x-reac coupled
         * compartment
        void setComptVolume( unsigned int comptIndex, Id id, double vol );
         */
    
        /// True when this voxel has data to be transferred.
        bool hasXfer( unsigned int comptIndex ) const;
    
        /**
         * True when there is a junction. i1 must match, and if i2 is
         * non-zero then it too must match.
         */
        bool isVoxelJunctionPresent( Id i1, Id i2 ) const;
        //////////////////////////////////////////////////////////////////
        // Functions for cross-compartment rate scaling.
        //////////////////////////////////////////////////////////////////
        /**
         * Initialize/reset the vector xReacScaling_ for scale factors
         * for each cross reaction in this voxel.
         */
        void resetXreacScale( unsigned int size );
    
        /**
         * Multiply in scale factor for different cross-reac volumes,
         * to be applied to specified RateTerm in the rates_ vector.
         * Applies to forward reaction terms
         */
        void forwardReacVolumeFactor( unsigned int i, double volume );
    
        /**
         * Multiply in scale factor for different cross-reac volumes,
         * to be applied to specified RateTerm in the rates_ vector.
         * Applies to backward reaction terms
         */
        void backwardReacVolumeFactor( unsigned int i, double volume );
    
        /**
         * Return scale factor for specified entry on rate terms.
         * Index is # of cross-compartment rate term.
         */
        double getXreacScaleSubstrates( unsigned int i ) const;
    
        /**
         * Return scale factor for specified entry on rate terms.
         * Index is # of cross-compartment rate term.
         */
        double getXreacScaleProducts( unsigned int i ) const;
    
        void scaleVolsBufsRates( double ratio, const Stoich* stoichPtr );
    
        /// Debugging utility
        void print() const;
    
    protected:
        const Stoich* stoichPtr_;
        vector< RateTerm* > rates_;
    
    private:
        /**
         * S_ is the array of molecules. Stored as n, number of molecules
         * per mesh entry.
         * The poolIndex specifies which molecular species pool to use.
         *
         * The first numVarPools_ in the poolIndex are state variables and
         * are integrated using the ODE solver or the GSSA solver.
         * The next numBufPools_ are fixed but can be changed by the script.
         * The next numFuncPools_ are computed using arbitrary functions of
         * any of the molecule levels, and the time.
         * The functions evaluate _before_ the solver.
         * The functions should not cascade as there is no guarantee of
         * execution order.
         */
        vector< double > S_;
    
        /**
         * Sinit_ specifies initial conditions at t = 0. Whenever the reac
         * system is rebuilt or reinited, all S_ values become set to Sinit.
         * Also used for buffered molecules as the fixed values of these
         * molecules.
         */
        vector< double > Sinit_;
    
        /**
         * The number of pools (at the end of S and Sinit) that are here
         * just as proxies for some off-compartment pools that participate
         * in cross-compartment reactions.
        unsigned int numProxyPools_;
         */
    
        /**
         * proxyPoolVoxels_[comptIndex][#]
         * Used to build the transfer vector.
         * Stores the voxels of proxy pools in specified compartment,
         */
        vector< vector< unsigned int > > proxyPoolVoxels_;
        /**
         * proxyTransferIndex_[comptIndex][#]
         * Stores the index in the transfer vector for proxy pools that
         * live on this voxel. The poolIndex and # of pools is known from
         * the xferPoolIdx_ vector stored on the Ksolve.
         */
        vector< vector< unsigned int > > proxyTransferIndex_;
    
        /**
         * Looks up comptIndex from compt. Actually just a set would do.
         */
        map< Id, unsigned int > proxyComptMap_;
    
        /** This is what I would need to fully identify proxy compts and
         * voxels for each proxy reac.
        vector< Id, Id, unsigned int, unsigned int>  proxyComptVoxel
         */
    
        /**
         * Volume of voxel.
         */
        double volume_;
    
        /**
         * xReacScaleSubstrates_[crossRateTermIndex]
         * Product of substrateVol/voxelVol for each of the substrates,
         * for forward reacs.
         * Applied to R1 of the RateTerm. Used only for cross reactions.
         */
        vector< double > xReacScaleSubstrates_;
    
        /**
         * xReacScaleProducts_[crossRateTermIndex]
         * Product of productVol/voxelVol for each of the products,
         * for reverse reacs.
         * Applied to R2 of the RateTerm. Used only for cross reactions.
         */
        vector< double > xReacScaleProducts_;
    };
    
    #endif	// _VOXEL_POOLS_BASE_H