The ParaMonte Documentation Website
Current view: top level - kernel - SpecBase_mod.f90 (source / functions) Hit Total Coverage
Test: ParaMonte 1.5.1 :: Serial Kernel - Code Coverage Report Lines: 253 253 100.0 %
Date: 2021-01-08 13:03:42 Functions: 6 6 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       2             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       3             : !!!!
       4             : !!!!   MIT License
       5             : !!!!
       6             : !!!!   ParaMonte: plain powerful parallel Monte Carlo library.
       7             : !!!!
       8             : !!!!   Copyright (C) 2012-present, The Computational Data Science Lab
       9             : !!!!
      10             : !!!!   This file is part of the ParaMonte library.
      11             : !!!!
      12             : !!!!   Permission is hereby granted, free of charge, to any person obtaining a 
      13             : !!!!   copy of this software and associated documentation files (the "Software"), 
      14             : !!!!   to deal in the Software without restriction, including without limitation 
      15             : !!!!   the rights to use, copy, modify, merge, publish, distribute, sublicense, 
      16             : !!!!   and/or sell copies of the Software, and to permit persons to whom the 
      17             : !!!!   Software is furnished to do so, subject to the following conditions:
      18             : !!!!
      19             : !!!!   The above copyright notice and this permission notice shall be 
      20             : !!!!   included in all copies or substantial portions of the Software.
      21             : !!!!
      22             : !!!!   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
      23             : !!!!   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
      24             : !!!!   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
      25             : !!!!   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
      26             : !!!!   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
      27             : !!!!   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
      28             : !!!!   OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      29             : !!!!
      30             : !!!!   ACKNOWLEDGMENT
      31             : !!!!
      32             : !!!!   ParaMonte is an honor-ware and its currency is acknowledgment and citations.
      33             : !!!!   As per the ParaMonte library license agreement terms, if you use any parts of 
      34             : !!!!   this library for any purposes, kindly acknowledge the use of ParaMonte in your 
      35             : !!!!   work (education/research/industry/development/...) by citing the ParaMonte 
      36             : !!!!   library as described on this page:
      37             : !!!!
      38             : !!!!       https://github.com/cdslaborg/paramonte/blob/main/ACKNOWLEDGMENT.md
      39             : !!!!
      40             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      41             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      42             : 
      43             : !> \brief
      44             : !> This module contains the classes and procedures for setting up the basic attributes of ParaMonte samplers.
      45             : !> For more information, see the description of this attributes in the body of the corresponding modules.
      46             : !> \author Amir Shahmoradi
      47             : 
      48             : module SpecBase_mod
      49             : 
      50             :     ! ParaMonte Spec variable types
      51             :     use SpecBase_SampleSize_mod                     , only: SampleSize_type
      52             :     use SpecBase_RandomSeed_mod                     , only: RandomSeed_type
      53             :     use SpecBase_Description_mod                    , only: Description_type
      54             :     use SpecBase_OutputFileName_mod                 , only: OutputFileName_type
      55             :     use SpecBase_OutputDelimiter_mod                , only: OutputDelimiter_type
      56             :     use SpecBase_ChainFileFormat_mod                , only: ChainFileFormat_type
      57             :     use SpecBase_VariableNameList_mod               , only: VariableNameList_type
      58             :     use SpecBase_RestartFileFormat_mod              , only: RestartFileFormat_type
      59             :     use SpecBase_OutputColumnWidth_mod              , only: OutputColumnWidth_type
      60             :     use SpecBase_OverwriteRequested_mod             , only: OverwriteRequested_type
      61             :     use SpecBase_OutputRealPrecision_mod            , only: OutputRealPrecision_type
      62             :     use SpecBase_SilentModeRequested_mod            , only: SilentModeRequested_type
      63             :     use SpecBase_DomainLowerLimitVec_mod            , only: DomainLowerLimitVec_type
      64             :     use SpecBase_DomainUpperLimitVec_mod            , only: DomainUpperLimitVec_type
      65             :     use SpecBase_ParallelizationModel_mod           , only: ParallelizationModel_type
      66             :     use SpecBase_InputFileHasPriority_mod           , only: InputFileHasPriority_type
      67             :     use SpecBase_ProgressReportPeriod_mod           , only: ProgressReportPeriod_type
      68             :     use SpecBase_TargetAcceptanceRate_mod           , only: TargetAcceptanceRate_type
      69             :     use SpecBase_MpiFinalizeRequested_mod           , only: MpiFinalizeRequested_type
      70             :     use SpecBase_MaxNumDomainCheckToWarn_mod        , only: MaxNumDomainCheckToWarn_type
      71             :     use SpecBase_MaxNumDomainCheckToStop_mod        , only: MaxNumDomainCheckToStop_type
      72             :     use SpecBase_InterfaceType_mod                  , only: InterfaceType_type
      73             :     use SpecBase_SystemInfoFilePath_mod             , only: SystemInfoFilePath_type
      74             : 
      75             :     ! ParaMonte namelist variables
      76             : 
      77             :     use SpecBase_SampleSize_mod                     , only: sampleSize
      78             :     use SpecBase_RandomSeed_mod                     , only: randomSeed
      79             :     use SpecBase_Description_mod                    , only: description
      80             :     use SpecBase_OutputFileName_mod                 , only: outputFileName
      81             :     use SpecBase_OutputDelimiter_mod                , only: outputDelimiter
      82             :     use SpecBase_ChainFileFormat_mod                , only: chainFileFormat
      83             :     use SpecBase_VariableNameList_mod               , only: variableNameList
      84             :     use SpecBase_RestartFileFormat_mod              , only: restartFileFormat
      85             :     use SpecBase_OutputColumnWidth_mod              , only: outputColumnWidth
      86             :     use SpecBase_OverwriteRequested_mod             , only: overwriteRequested
      87             :     use SpecBase_OutputRealPrecision_mod            , only: outputRealPrecision
      88             :     use SpecBase_SilentModeRequested_mod            , only: silentModeRequested
      89             :     use SpecBase_DomainLowerLimitVec_mod            , only: domainLowerLimitVec
      90             :     use SpecBase_DomainUpperLimitVec_mod            , only: domainUpperLimitVec
      91             :     use SpecBase_ParallelizationModel_mod           , only: ParallelizationModel
      92             :     use SpecBase_InputFileHasPriority_mod           , only: inputFileHasPriority
      93             :     use SpecBase_ProgressReportPeriod_mod           , only: progressReportPeriod
      94             :     use SpecBase_TargetAcceptanceRate_mod           , only: targetAcceptanceRate
      95             :     use SpecBase_MpiFinalizeRequested_mod           , only: mpiFinalizeRequested
      96             :     use SpecBase_MaxNumDomainCheckToWarn_mod        , only: maxNumDomainCheckToWarn
      97             :     use SpecBase_MaxNumDomainCheckToStop_mod        , only: maxNumDomainCheckToStop
      98             :     use SpecBase_InterfaceType_mod                  , only: interfaceType
      99             :     use SpecBase_SystemInfoFilePath_mod             , only: systemInfoFilePath
     100             : 
     101             :     implicit none
     102             : 
     103             :     character(*), parameter :: MODULE_NAME = "@SpecBase_mod"
     104             : 
     105             :     type                                        :: SpecBase_type
     106             :         type(SampleSize_type)                   :: SampleSize
     107             :         type(RandomSeed_type)                   :: RandomSeed
     108             :         type(Description_type)                  :: Description
     109             :         type(OutputFileName_type)               :: OutputFileName
     110             :         type(OutputDelimiter_type)              :: OutputDelimiter
     111             :         type(ChainFileFormat_type)              :: ChainFileFormat
     112             :         type(VariableNameList_type)             :: VariableNameList
     113             :         type(RestartFileFormat_type)            :: RestartFileFormat
     114             :         type(OutputColumnWidth_type)            :: OutputColumnWidth
     115             :         type(OverwriteRequested_type)           :: OverwriteRequested
     116             :         type(OutputRealPrecision_type)          :: OutputRealPrecision
     117             :         type(SilentModeRequested_type)          :: SilentModeRequested
     118             :         type(DomainLowerLimitVec_type)          :: domainLowerLimitVec
     119             :         type(DomainUpperLimitVec_type)          :: domainUpperLimitVec
     120             :         type(ParallelizationModel_type)         :: ParallelizationModel
     121             :         type(InputFileHasPriority_type)         :: InputFileHasPriority
     122             :         type(ProgressReportPeriod_type)         :: ProgressReportPeriod
     123             :         type(TargetAcceptanceRate_type)         :: TargetAcceptanceRate
     124             :         type(MpiFinalizeRequested_type)         :: MpiFinalizeRequested
     125             :         type(MaxNumDomainCheckToWarn_type)      :: MaxNumDomainCheckToWarn
     126             :         type(MaxNumDomainCheckToStop_type)      :: MaxNumDomainCheckToStop
     127             :         type(InterfaceType_type)                :: InterfaceType
     128             :         type(SystemInfoFilePath_type)           :: SystemInfoFilePath
     129             :     contains
     130             :         procedure, pass                         :: nullifyNameListVar
     131             :         procedure, pass                         :: setFromInputFile
     132             :         procedure, pass                         :: setFromInputArgs
     133             :         procedure, pass                         :: checkForSanity
     134             :         procedure, pass                         :: reportValues
     135             :     end type SpecBase_type
     136             : 
     137             :     interface SpecBase_type
     138             :         module procedure                        :: constructSpecBase
     139             :     end interface SpecBase_type
     140             : 
     141             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     142             : 
     143             : contains
     144             : 
     145             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     146             : 
     147         349 :     function constructSpecBase(nd,methodName,imageID,imageCount) result(SpecBase)
     148             : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
     149             :         !DEC$ ATTRIBUTES DLLEXPORT :: constructSpecBase
     150             : #endif
     151             :         use Constants_mod, only: IK
     152             :         implicit none
     153             :         character(*), intent(in)    :: methodName
     154             :         integer(IK), intent(in)     :: nd
     155             :         integer(IK), intent(in)     :: imageID, imageCount
     156             :         type(SpecBase_type)         :: SpecBase
     157         349 :         SpecBase%SampleSize                         = SampleSize_type(methodName)
     158         349 :         SpecBase%RandomSeed                         = RandomSeed_type(methodName,imageID,imageCount)
     159         349 :         SpecBase%Description                        = Description_type(methodName)
     160         349 :         SpecBase%OutputFileName                     = OutputFileName_type(methodName)
     161         349 :         SpecBase%OutputDelimiter                    = OutputDelimiter_type(methodName)
     162         349 :         SpecBase%ChainFileFormat                    = ChainFileFormat_type(methodName)
     163         349 :         SpecBase%VariableNameList                   = VariableNameList_type(nd,methodName)
     164         349 :         SpecBase%RestartFileFormat                  = RestartFileFormat_type(methodName)
     165         349 :         SpecBase%OutputColumnWidth                  = OutputColumnWidth_type(methodName)
     166         349 :         SpecBase%OverwriteRequested                 = OverwriteRequested_type(methodName)
     167         349 :         SpecBase%OutputRealPrecision                = OutputRealPrecision_type(methodName)
     168         349 :         SpecBase%SilentModeRequested                = SilentModeRequested_type(methodName)
     169         349 :         SpecBase%DomainLowerLimitVec                = DomainLowerLimitVec_type(methodName)
     170         349 :         SpecBase%DomainUpperLimitVec                = DomainUpperLimitVec_type(methodName)
     171         349 :         SpecBase%ParallelizationModel               = ParallelizationModel_type(methodName)
     172         349 :         SpecBase%InputFileHasPriority               = InputFileHasPriority_type(methodName)
     173         349 :         SpecBase%ProgressReportPeriod               = ProgressReportPeriod_type()
     174         349 :         SpecBase%TargetAcceptanceRate               = TargetAcceptanceRate_type(methodName)
     175         349 :         SpecBase%MpiFinalizeRequested               = MpiFinalizeRequested_type(methodName)
     176         349 :         SpecBase%MaxNumDomainCheckToWarn            = MaxNumDomainCheckToWarn_type()
     177         349 :         SpecBase%MaxNumDomainCheckToStop            = MaxNumDomainCheckToStop_type()
     178         349 :         SpecBase%InterfaceType                      = InterfaceType_type()
     179         349 :         SpecBase%SystemInfoFilePath                 = SystemInfoFilePath_type()
     180         349 :     end function constructSpecBase
     181             : 
     182             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     183             : 
     184         349 :     subroutine nullifyNameListVar( SpecBase, nd )
     185             : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
     186             :         !DEC$ ATTRIBUTES DLLEXPORT :: nullifyNameListVar
     187             : #endif
     188         349 :         use Constants_mod, only: IK
     189             :         implicit none
     190             :         class(SpecBase_type), intent(inout) :: SpecBase
     191             :         integer(IK), intent(in)             :: nd
     192             :         ! nullify SpecBase global variables that have to be read form the input namelist file
     193         349 :         call SpecBase%SampleSize                    %nullifyNameListVar()
     194         349 :         call SpecBase%RandomSeed                    %nullifyNameListVar()
     195         349 :         call SpecBase%Description                   %nullifyNameListVar()
     196         349 :         call SpecBase%OutputFileName                %nullifyNameListVar()
     197         349 :         call SpecBase%OutputDelimiter               %nullifyNameListVar()
     198         349 :         call SpecBase%ChainFileFormat               %nullifyNameListVar()
     199         349 :         call SpecBase%VariableNameList              %nullifyNameListVar(nd)
     200         349 :         call SpecBase%RestartFileFormat             %nullifyNameListVar()
     201         349 :         call SpecBase%OutputColumnWidth             %nullifyNameListVar()
     202         349 :         call SpecBase%OverwriteRequested            %nullifyNameListVar()
     203         349 :         call SpecBase%DomainLowerLimitVec           %nullifyNameListVar(nd)
     204         349 :         call SpecBase%DomainUpperLimitVec           %nullifyNameListVar(nd)
     205         349 :         call SpecBase%OutputRealPrecision           %nullifyNameListVar()
     206         349 :         call SpecBase%SilentModeRequested           %nullifyNameListVar()
     207         349 :         call SpecBase%ProgressReportPeriod          %nullifyNameListVar()
     208         349 :         call SpecBase%ParallelizationModel          %nullifyNameListVar()
     209         349 :         call SpecBase%InputFileHasPriority          %nullifyNameListVar()
     210         349 :         call SpecBase%TargetAcceptanceRate          %nullifyNameListVar()
     211         349 :         call SpecBase%MpiFinalizeRequested          %nullifyNameListVar()
     212         349 :         call SpecBase%MaxNumDomainCheckToWarn       %nullifyNameListVar()
     213         349 :         call SpecBase%MaxNumDomainCheckToStop       %nullifyNameListVar()
     214         349 :         call SpecBase%InterfaceType                 %nullifyNameListVar()
     215         349 :         call SpecBase%SystemInfoFilePath            %nullifyNameListVar()
     216         349 :     end subroutine nullifyNameListVar
     217             : 
     218             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     219             : 
     220         349 :     subroutine setFromInputFile( SpecBase, Err )
     221             : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
     222             :         !DEC$ ATTRIBUTES DLLEXPORT :: setFromInputFile
     223             : #endif
     224             : 
     225         349 :         use Constants_mod, only: IK, RK
     226             :         use Err_mod, only: Err_type
     227             : 
     228             :         implicit none
     229             : 
     230             :         class(SpecBase_type), intent(inout) :: SpecBase
     231             :         type(Err_type), intent(inout)       :: Err
     232             : 
     233             :         character(*), parameter :: PROCEDURE_NAME = MODULE_NAME // "@setFromInputFile()"
     234             : 
     235         349 :         call SpecBase%SampleSize                    %set(sampleSize)
     236         349 :         call SpecBase%RandomSeed                    %set(randomSeed,Err)
     237         349 :         call SpecBase%Description                   %set(description)
     238         349 :         call SpecBase%OutputFileName                %set(outputFileName)
     239         349 :         call SpecBase%ChainFileFormat               %set(chainFileFormat)
     240         349 :         call SpecBase%VariableNameList              %set(VariableNameList)
     241         349 :         call SpecBase%RestartFileFormat             %set(restartFileFormat)
     242         349 :         call SpecBase%DomainLowerLimitVec           %set(domainLowerLimitVec)
     243         349 :         call SpecBase%DomainUpperLimitVec           %set(domainUpperLimitVec)
     244             : 
     245             :         ! do not change the order with outputDelimiter
     246         349 :         call SpecBase%OutputColumnWidth             %set(outputColumnWidth)
     247         349 :         call SpecBase%OutputDelimiter               %set(SpecBase%OutputColumnWidth%val, outputDelimiter)
     248             : 
     249         349 :         call SpecBase%OverwriteRequested            %set(overwriteRequested)
     250         349 :         call SpecBase%OutputRealPrecision           %set(outputRealPrecision)
     251         349 :         call SpecBase%SilentModeRequested           %set(silentModeRequested)
     252         349 :         call SpecBase%ProgressReportPeriod          %set(progressReportPeriod)
     253         349 :         call SpecBase%ParallelizationModel          %set(parallelizationModel)
     254         349 :         call SpecBase%InputFileHasPriority          %set(inputFileHasPriority)
     255         349 :         call SpecBase%TargetAcceptanceRate          %set(TargetAcceptanceRate)
     256         349 :         call SpecBase%MpiFinalizeRequested          %set(mpiFinalizeRequested)
     257         349 :         call SpecBase%MaxNumDomainCheckToWarn       %set(maxNumDomainCheckToWarn)
     258         349 :         call SpecBase%MaxNumDomainCheckToStop       %set(maxNumDomainCheckToStop)
     259         349 :         call SpecBase%InterfaceType                 %set(interfaceType)
     260         349 :         call SpecBase%SystemInfoFilePath            %set(systemInfoFilePath)
     261             : 
     262         349 :         if (Err%occurred) Err%msg = PROCEDURE_NAME // Err%msg
     263             : 
     264         349 :     end subroutine setFromInputFile
     265             : 
     266             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     267             : 
     268         347 :     subroutine setFromInputArgs ( SpecBase, Err &
     269             :                                 , sampleSize &
     270             :                                 , randomSeed &
     271             :                                 , description &
     272             :                                 , outputFileName &
     273             :                                 , outputDelimiter &
     274             :                                 , chainFileFormat &
     275         347 :                                 , variableNameList &
     276         347 :                                 , domainLowerLimitVec &
     277         347 :                                 , domainUpperLimitVec &
     278             :                                 , restartFileFormat &
     279             :                                 , outputColumnWidth &
     280             :                                 , overwriteRequested &
     281             :                                 , outputRealPrecision &
     282             :                                 , silentModeRequested &
     283             :                                 , parallelizationModel &
     284             :                                 , progressReportPeriod &
     285             :                                 , TargetAcceptanceRate &
     286             :                                 , mpiFinalizeRequested &
     287             :                                 , maxNumDomainCheckToWarn &
     288             :                                 , maxNumDomainCheckToStop &
     289             :                                 )
     290             : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
     291             :         !DEC$ ATTRIBUTES DLLEXPORT :: setFromInputArgs
     292             : #endif
     293             : 
     294         349 :         use Constants_mod, only: IK, RK
     295             :         use Err_mod, only: Err_type
     296             : 
     297             :         implicit none
     298             : 
     299             :         class(SpecBase_type), intent(inout) :: SpecBase
     300             :         type(Err_type), intent(inout)       :: Err
     301             : 
     302             :         character(*), parameter :: PROCEDURE_NAME = MODULE_NAME // "@setFromInputArgs()"
     303             : 
     304             :         ! ParaMonte variables
     305             :         integer(IK) , intent(in), optional  :: sampleSize
     306             :         integer(IK) , intent(in), optional  :: randomSeed
     307             :         character(*), intent(in), optional  :: description
     308             :         character(*), intent(in), optional  :: outputFileName
     309             :         character(*), intent(in), optional  :: outputDelimiter
     310             :         character(*), intent(in), optional  :: chainFileFormat
     311             :         character(*), intent(in), optional  :: variableNameList(:)
     312             :         character(*), intent(in), optional  :: restartFileFormat
     313             :         integer(IK) , intent(in), optional  :: outputColumnWidth
     314             :         logical     , intent(in), optional  :: overwriteRequested
     315             :         integer(IK) , intent(in), optional  :: outputRealPrecision
     316             :         logical     , intent(in), optional  :: silentModeRequested
     317             :         real(RK)    , intent(in), optional  :: domainLowerLimitVec(:)
     318             :         real(RK)    , intent(in), optional  :: domainUpperLimitVec(:)
     319             :         character(*), intent(in), optional  :: parallelizationModel
     320             :         integer(IK) , intent(in), optional  :: progressReportPeriod
     321             :         real(RK)    , intent(in), optional  :: TargetAcceptanceRate(2)
     322             :         logical     , intent(in), optional  :: mpiFinalizeRequested
     323             :         integer(IK) , intent(in), optional  :: maxNumDomainCheckToWarn
     324             :         integer(IK) , intent(in), optional  :: maxNumDomainCheckToStop
     325             : 
     326         347 :         if (present(sampleSize))                    call SpecBase%SampleSize                    %set(sampleSize)
     327         347 :         if (present(randomSeed))                    call SpecBase%RandomSeed                    %set(randomSeed,Err)
     328         347 :         if (present(description))                   call SpecBase%Description                   %set(description)
     329         347 :         if (present(outputFileName))                call SpecBase%OutputFileName                %set(outputFileName)
     330         347 :         if (present(chainFileFormat))               call SpecBase%ChainFileFormat               %set(chainFileFormat)
     331         347 :         if (present(variableNameList))              call SpecBase%VariableNameList              %set(variableNameList)
     332         347 :         if (present(restartFileFormat))             call SpecBase%RestartFileFormat             %set(restartFileFormat)
     333         347 :         if (present(domainLowerLimitVec))           call SpecBase%DomainLowerLimitVec           %set(domainLowerLimitVec)
     334         347 :         if (present(domainUpperLimitVec))           call SpecBase%DomainUpperLimitVec           %set(domainUpperLimitVec)
     335             : 
     336             :         ! do not change the order with outputDelimiter
     337         347 :         if (present(outputColumnWidth))             call SpecBase%OutputColumnWidth             %set(outputColumnWidth)
     338         347 :         call SpecBase%OutputDelimiter%set(SpecBase%OutputColumnWidth%val, outputDelimiter)
     339             : 
     340         347 :         if (present(overwriteRequested))            call SpecBase%OverwriteRequested            %set(overwriteRequested)
     341         347 :         if (present(parallelizationModel))          call SpecBase%ParallelizationModel          %set(parallelizationModel)
     342         347 :         if (present(outputRealPrecision))           call SpecBase%OutputRealPrecision           %set(outputRealPrecision)
     343         347 :         if (present(silentModeRequested))           call SpecBase%SilentModeRequested           %set(silentModeRequested)
     344         347 :         if (present(progressReportPeriod))          call SpecBase%ProgressReportPeriod          %set(progressReportPeriod)
     345         347 :         if (present(TargetAcceptanceRate))          call SpecBase%TargetAcceptanceRate          %set(TargetAcceptanceRate)
     346         347 :         if (present(mpiFinalizeRequested))          call SpecBase%MpiFinalizeRequested          %set(mpiFinalizeRequested)
     347         347 :         if (present(maxNumDomainCheckToWarn))       call SpecBase%MaxNumDomainCheckToWarn       %set(maxNumDomainCheckToWarn)
     348         347 :         if (present(maxNumDomainCheckToStop))       call SpecBase%MaxNumDomainCheckToStop       %set(maxNumDomainCheckToStop)
     349             : 
     350         347 :         if (Err%occurred) Err%msg = PROCEDURE_NAME // Err%msg
     351             : 
     352         694 :     end subroutine setFromInputArgs
     353             : 
     354             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     355             : 
     356         323 :     subroutine reportValues(SpecBase,prefix,outputUnit,isLeaderImage)
     357             : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
     358             :         !DEC$ ATTRIBUTES DLLEXPORT :: reportValues
     359             : #endif
     360         347 :         use Decoration_mod, only: GENERIC_OUTPUT_FORMAT
     361             :         use Decoration_mod, only: GENERIC_TABBED_FORMAT
     362             :         use Decoration_mod, only: TAB
     363             :         use Constants_mod, only: IK, UNDEFINED
     364             :         use Err_mod, only: note, informUser
     365             :         implicit none
     366             :         class(SpecBase_type), intent(in)    :: SpecBase
     367             :         character(*), intent(in)            :: prefix
     368             :         integer(IK) , intent(in)            :: outputUnit
     369             :         logical     , intent(in)            :: isLeaderImage
     370             :         integer(IK)                         :: i, ndim
     371         323 :         character(:), allocatable           :: msg
     372             : 
     373         323 :         if (isLeaderImage) then
     374             : 
     375         323 :             ndim = size(SpecBase%DomainLowerLimitVec%Val(:))
     376             :             msg =   "ndim is a 32-bit positive integer, representing the number of dimensions of the domain of the objective function. &
     377             :                     &It is the only simulation specification variable that the user must always provide along with the objective function, &
     378             :                     &separately from the rest of the simulation specifications. The variable ndim must be always provided directly to the ParaMonte &
     379             :                     &routines, along with the objective function. If specified within an input file, its value will be ignored and not used. &
     380         323 :                     &The variable ndim has no default value as it is the only mandatory piece of information that must be provided by the user."
     381         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     382         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "ndim"
     383         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     384         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) ndim
     385         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = msg )
     386             : 
     387             : 
     388         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     389         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "description"
     390         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     391         323 :             call informUser( outputUnit = outputUnit, newline = "\n", wrapWidth = 125_IK, prefix = TAB//TAB, marginTop = 0_IK, marginBot = 0_IK, msg = SpecBase%Description%val )
     392         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%Description%desc )
     393             : 
     394             : 
     395         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     396         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "inputFileHasPriority"
     397         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     398         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%InputFileHasPriority%val
     399         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%InputFileHasPriority%desc )
     400             : 
     401             : 
     402         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     403         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "silentModeRequested"
     404         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     405         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%SilentModeRequested%val
     406         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%SilentModeRequested%desc )
     407             : 
     408             : 
     409         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     410         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "domainLowerLimitVec"
     411         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     412         779 :             do i = 1, ndim
     413         779 :                 write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%DomainLowerLimitVec%Val(i)
     414             :             end do
     415         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%DomainLowerLimitVec%desc )
     416             : 
     417             : 
     418         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     419         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "domainUpperLimitVec"
     420         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     421         779 :             do i = 1, ndim
     422         779 :                 write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%DomainUpperLimitVec%Val(i)
     423             :             end do
     424         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%DomainUpperLimitVec%desc )
     425             : 
     426             : 
     427         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     428         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "variableNameList"
     429         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     430         779 :             do i = 1, ndim
     431         779 :                 write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%VariableNameList%Val(i)
     432             :             end do
     433         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%VariableNameList%desc )
     434             : 
     435             : 
     436         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     437         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "parallelizationModel"
     438         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     439         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%ParallelizationModel%val
     440         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%ParallelizationModel%desc )
     441             : 
     442             : 
     443         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     444         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "mpiFinalizeRequested"
     445         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     446         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%MpiFinalizeRequested%val
     447         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%MpiFinalizeRequested%desc )
     448             : 
     449             : 
     450         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     451         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "outputFileName"
     452         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     453         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%OutputFileName%modified
     454         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%OutputFileName%desc )
     455             : 
     456             : 
     457         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     458         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "overwriteRequested"
     459         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     460         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%OverwriteRequested%val
     461         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%OverwriteRequested%desc )
     462             : 
     463             : 
     464         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     465         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "targetAcceptanceRate"
     466         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     467         323 :             if ( SpecBase%TargetAcceptanceRate%scalingRequested ) then
     468          20 :                 if ( SpecBase%TargetAcceptanceRate%Val(1)==SpecBase%TargetAcceptanceRate%Val(2) ) then
     469           8 :                     write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%TargetAcceptanceRate%Val(1)
     470             :                 else
     471          12 :                     write(outputUnit,GENERIC_TABBED_FORMAT) "[", SpecBase%TargetAcceptanceRate%Val(1), ",", SpecBase%TargetAcceptanceRate%Val(2), "]"
     472             :                 end if
     473             :             else
     474         303 :                 write(outputUnit,GENERIC_TABBED_FORMAT) UNDEFINED
     475             :             end if
     476         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%TargetAcceptanceRate%desc )
     477             : 
     478             : 
     479         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     480         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "sampleSize"
     481         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     482         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%SampleSize%val
     483         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%SampleSize%desc )
     484             : 
     485             : 
     486         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     487         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "randomSeed"
     488         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     489         323 :             if ( SpecBase%RandomSeed%userSeed == SpecBase%RandomSeed%nullSeed ) then
     490         287 :                 write(outputUnit,GENERIC_TABBED_FORMAT) UNDEFINED
     491             :             else
     492          36 :                 write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%RandomSeed%userSeed
     493             :             end if
     494             : 
     495             : 
     496         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     497         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) "ThisProcessID", "RandomSeedVectorSize", "RandomSeedVectorValues"
     498         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%RandomSeed%imageID, SpecBase%RandomSeed%sizeSeed, SpecBase%RandomSeed%Seed(:,SpecBase%RandomSeed%imageID)
     499         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     500         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) "OtherProcessID", "RandomSeedVectorSize", "RandomSeedVectorValues"
     501         323 :             if (SpecBase%RandomSeed%imageCount==1) then
     502         323 :                 write(outputUnit,GENERIC_TABBED_FORMAT) "No other processor exists."
     503             : #if defined CAF_ENABLED || defined MPI_ENABLED
     504             :             else
     505             :                 do i = 1, SpecBase%RandomSeed%imageCount
     506             :                     if (i/=SpecBase%RandomSeed%imageID) write(outputUnit,GENERIC_TABBED_FORMAT) i, SpecBase%RandomSeed%sizeSeed, SpecBase%RandomSeed%Seed(:,i)
     507             :                 end do
     508             : #endif
     509             :             end if
     510         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%RandomSeed%desc )
     511             : 
     512             : 
     513         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     514         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "outputColumnWidth"
     515         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     516         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%OutputColumnWidth%val
     517         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%OutputColumnWidth%desc )
     518             : 
     519             : 
     520             :             !block
     521             :             !use Constants_mod, only: TAB
     522             :             !character(:), allocatable :: delimiter
     523             :             !delimiter = SpecBase%OutputDelimiter%val
     524             :             !if (SpecBase%OutputDelimiter%val==TAB) delimiter = "\t"
     525             :             !if (SpecBase%OutputDelimiter%val=="\t") delimiter = "\\t"
     526         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     527         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "outputDelimiter"
     528         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     529         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%OutputDelimiter%val
     530         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%OutputDelimiter%desc )
     531             :             !end block
     532             : 
     533         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     534         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "outputRealPrecision"
     535         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     536         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%OutputRealPrecision%val
     537         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%OutputRealPrecision%desc )
     538             : 
     539             : 
     540         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     541         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "chainFileFormat"
     542         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     543         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%ChainFileFormat%val
     544         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%ChainFileFormat%desc )
     545             : 
     546             : 
     547         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     548         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "restartFileFormat"
     549         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     550         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%RestartFileFormat%val
     551         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%RestartFileFormat%desc )
     552             : 
     553             : 
     554         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     555         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "progressReportPeriod"
     556         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     557         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%ProgressReportPeriod%val
     558         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%ProgressReportPeriod%desc )
     559             : 
     560             : 
     561         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     562         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "maxNumDomainCheckToWarn"
     563         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     564         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%MaxNumDomainCheckToWarn%val
     565         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%MaxNumDomainCheckToWarn%desc )
     566             : 
     567             : 
     568         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     569         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT) "maxNumDomainCheckToStop"
     570         323 :             write(outputUnit,GENERIC_OUTPUT_FORMAT)
     571         323 :             write(outputUnit,GENERIC_TABBED_FORMAT) SpecBase%MaxNumDomainCheckToStop%val
     572         323 :             if (SpecBase%SilentModeRequested%isFalse) call note( prefix = prefix, outputUnit = outputUnit, newline = "\n", msg = SpecBase%MaxNumDomainCheckToStop%desc )
     573             : 
     574             : 
     575             :         end if
     576             : 
     577             : 
     578         323 :     end subroutine reportValues
     579             : 
     580             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     581             : 
     582         345 :     subroutine checkForSanity(SpecBase,Err,methodName)
     583             : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
     584             :         !DEC$ ATTRIBUTES DLLEXPORT :: checkForSanity
     585             : #endif
     586         323 :         use Err_mod, only: Err_type
     587             :         implicit none
     588             :         class(SpecBase_type), intent(in)    :: SpecBase
     589             :         type(Err_type), intent(inout)       :: Err
     590             :         character(*), intent(in)            :: methodName
     591         345 :         call SpecBase%ChainFileFormat           %checkForSanity(Err,methodName)
     592         345 :         call SpecBase%OutputDelimiter           %checkForSanity(Err,methodName)
     593         345 :         call SpecBase%DomainLowerLimitVec       %checkForSanity(Err)
     594         345 :         call SpecBase%DomainUpperLimitVec       %checkForSanity(Err,SpecBase%DomainLowerLimitVec%Val)
     595         345 :         call SpecBase%RestartFileFormat         %checkForSanity(Err,methodName)
     596         345 :         call SpecBase%OutputColumnWidth         %checkForSanity(Err,methodName, SpecBase%OutputRealPrecision%val)
     597         345 :         call SpecBase%OutputRealPrecision       %checkForSanity(Err,methodName)
     598         345 :         call SpecBase%ParallelizationModel      %checkForSanity(Err,methodName)
     599         345 :         call SpecBase%ProgressReportPeriod      %checkForSanity(Err,methodName)
     600         345 :         call SpecBase%TargetAcceptanceRate      %checkForSanity(Err)
     601         345 :         call SpecBase%MaxNumDomainCheckToWarn   %checkForSanity(Err,methodName)
     602         345 :         call SpecBase%MaxNumDomainCheckToStop   %checkForSanity(Err,methodName)
     603         690 :     end subroutine checkForSanity
     604             : 
     605             : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     606             : 
     607             : end module SpecBase_mod ! LCOV_EXCL_LINE

ParaMonte: Plain Powerful Parallel Monte Carlo Library 
The Computational Data Science Lab
© Copyright 2012 - 2021