0001 function [seeding seedingTimeVector] = prepareSeeding(seeding, pbeDef, ...
0002 optionStruct)
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 seedingTimeVector = nan(1, length(seeding));
0024 flagDensity = pbeDef.optionStruct.density;
0025 dec = pbeDef.dec;
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 if length(seeding) > 1
0039 error('elk:pbeSolver:wrongInput', ['Handling of multiple seed ' ...
0040 'populations is currently not properly supported. View notes in ' ...
0041 'this function for details']);
0042 end
0043
0044
0045 for iSeed = 1:length(seeding)
0046
0047 if isfield(seeding, 'time') && ~isempty(seeding(iSeed).time)
0048 seedingTimeVector(iSeed) = seeding(iSeed).time;
0049 elseif iSeed == 1
0050 seedingTimeVector(iSeed) = 0;
0051 else
0052 error('elk:pbeSolver:wrongInput', ['You need to provide the seeding ' ...
0053 'time with pbeDefinition.seeding(iSeed).time.']);
0054 end
0055
0056
0057 if isfield(seeding, 'disD') && ...
0058 (isfield(seeding, 'disC') || isfield(seeding, 'fhandle'))
0059 seeding(iSeed).positionMatrix = seeding(iSeed).disD.positionMatrix;
0060 seeding(iSeed).probabilityVector = seeding(iSeed).disD.probabilityVector;
0061 if isfield(seeding, 'fhandle')
0062 thisHandle = seeding(iSeed).fhandle;
0063 else
0064 thisHandle = seeding(iSeed).disC.fhandle;
0065 end
0066 seeding(iSeed).numberVector = ...
0067 1/length(seeding(iSeed).probabilityVector) * ...
0068 thisHandle(seeding(iSeed).positionMatrix) ./ ...
0069 seeding(iSeed).probabilityVector;
0070 end
0071
0072
0073 if ~isfield(seeding, 'probabilityVector') || ...
0074 isempty(seeding(iSeed).probabilityVector')
0075
0076 if flagDensity
0077 error('elk:pbeSolver:wrongInput', ['To provide ' ...
0078 'distribution density information, you need to provide the ' ...
0079 'probability density of selecting the pivots in seeding ' ...
0080 'population ' num2str(iSeed)]);
0081 end;
0082
0083
0084 seeding(iSeed).probabilityVector = ...
0085 seeding(iSeed).numberVector*0 + nan;
0086 end
0087
0088
0089
0090 seeding(iSeed).numberVector = seeding(iSeed).numberVector(:)';
0091 seeding(iSeed).probabilityVector = seeding(iSeed).probabilityVector(:)';
0092
0093 if size(seeding(iSeed).positionMatrix, 1) - pbeDef.nExtraCoordinate ...
0094 ~= pbeDef.dec.nC
0095 error('elk:populationBalance:wrongInput', ['Number of rows in ' ...
0096 ' positionMatrix of seeding(' num2str(iSeed) ') does not ' ...
0097 'match the dimension of the problem.']);
0098 end
0099
0100 nSample = size(seeding(iSeed).positionMatrix, 2);
0101 if length(seeding(iSeed).numberVector) ~= nSample || ...
0102 length(seeding(iSeed).probabilityVector) ~= nSample
0103 error('elk:populationBalance:wrongInput', ['Elements in in ' ...
0104 ' numberVector or probabilityVector of seeding(' ...
0105 num2str(iSeed) ') does not match the number of sample points']);
0106 end
0107
0108
0109 if dec.isComplete
0110 toleranceValue = optionStruct.distanceLimit;
0111 if (dec.isOrdinary && ...
0112 any(any(dec.confinementCone.A * seeding(iSeed).positionMatrix(1:dec.nC, :) > toleranceValue)) ...
0113 ) || (~dec.isOrdinary && ...
0114 any(any(dec.confinementConeHull.A * seeding(iSeed).positionMatrix(1:dec.nC, :) > toleranceValue)) ...
0115 )
0116 error('elk:populationBalance:wrongInput', ...
0117 ['Not all pivots of seeding population ' num2str(iSeed) ...
0118 ' reside in the confinement cone']);
0119 end
0120 end
0121
0122 end