0001 function derivativeStruct = genericDerivative(solverState, time, ...
0002 pbeDefinition)
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 time = time
0036 nDecCoordinate = pbeDefinition.nDecCoordinate;
0037 nExtraCoordinate = pbeDefinition.nExtraCoordinate;
0038
0039
0040
0041
0042
0043
0044
0045 [pivotPositionMeasureMatrix pivotUnifiedPartitionVector fractionCorrected] = ...
0046 ensureProperDecData(solverState.hcMatrix, solverState.upVector, ...
0047 pbeDefinition);
0048
0049
0050 pivotPropertyMatrix = pbeDefinition.pivotProperty(pivotPositionMeasureMatrix, ...
0051 max(pivotUnifiedPartitionVector, 1));
0052
0053
0054 bulkPropertyVector = pbeDefinition.bulkProperty(pivotPropertyMatrix, ...
0055 solverState.numberVector, solverState.bulkStateVector, time);
0056
0057
0058 bulkRate = pbeDefinition.bulkRate(bulkPropertyVector, time);
0059 nucleationRate = pbeDefinition.nucleationRate(bulkPropertyVector, time);
0060 growthRateMatrix = pbeDefinition.growthRate(pivotPositionMeasureMatrix, ...
0061 pivotPropertyMatrix, bulkPropertyVector, time);
0062
0063
0064
0065
0066
0067 if pbeDefinition.optionStruct.limitGrowthRate
0068 positionDerivativeMatrix = [...
0069 limitGrowthRate(growthRateMatrix(1:(end-nExtraCoordinate), :), ...
0070 solverState.hcMatrix(1:nDecCoordinate, :), ...
0071 pivotUnifiedPartitionVector, ...
0072 pbeDefinition.dec, ...
0073 pbeDefinition.optionStruct.distanceLimit);...
0074 growthRateMatrix((end-nExtraCoordinate+1):end, :)];
0075 else
0076 positionDerivativeMatrix = growthRateMatrix;
0077 end
0078
0079
0080 derivativeStruct.bulkStateVector = bulkRate;
0081 derivativeStruct.hcMatrix = positionDerivativeMatrix;
0082 derivativeStruct.flagDensity = solverState.flagDensity;
0083 if ~isempty(positionDerivativeMatrix)
0084 derivativeStruct.numberVector = positionDerivativeMatrix(1,:)*0;
0085 else
0086 derivativeStruct.numberVector = zeros(1, 0);
0087 end
0088 if solverState.flagNucleation
0089 derivativeStruct.numberVector(1) = nucleationRate;
0090 derivativeStruct.hcMatrix(:,1) = 0.5*derivativeStruct.hcMatrix(:,1);
0091 end
0092
0093
0094
0095
0096 if solverState.flagDensity
0097
0098 divergenceVector = zeros(1, length(solverState.probabilityVector));
0099 for iDim = 1:size(solverState.hcMatrix, 1)
0100
0101 forwardSolverState = solverState;
0102 deltaVector = min(...
0103 pbeDefinition.optionStruct.gradientRelativeDelta * ...
0104 forwardSolverState.hcMatrix(iDim, :), ...
0105 pbeDefinition.optionStruct.gradientAbsoluteDelta + ...
0106 0*forwardSolverState.hcMatrix(iDim, :));
0107
0108 forwardSolverState.hcMatrix(iDim, :) = ...
0109 forwardSolverState.hcMatrix(iDim, :) + deltaVector;
0110
0111 forwardSolverState.flagDensity = 0;
0112 forwardDerivativeStruct = genericDerivative(forwardSolverState, time, ...
0113 pbeDefinition);
0114
0115
0116 divergenceVector = divergenceVector + ...
0117 (forwardDerivativeStruct.hcMatrix(iDim, :) - ...
0118 derivativeStruct.hcMatrix(iDim, :)...
0119 ) ./ deltaVector;
0120 end
0121 derivativeStruct.probabilityVector = -1*...
0122 solverState.probabilityVector .* divergenceVector;
0123 end
0124
0125
0126 derivativeStruct.fractionCorrected = fractionCorrected;
0127 derivativeStruct.partitionIndexVector = pivotUnifiedPartitionVector;
0128
0129 end